运行 当 API 端点被命中时的脚本,并在再次被命中时检查该脚本是否是 运行 - Node.js

Run a script when API endpoint is hit, and check if that script is running when hit again - Node.js

我正在处理一个 node.js API 需要 start/run 一个耗时的 javaScript 文件,当某个端点被命中时。我有这个工作,但我现在正在寻找的是一种方法来停止脚本从 运行ning 再次,如果它已经 运行ning 并且端点再次被击中。

我尝试使用 child_process 库,希望如果脚本作为独立于主 node.js 应用程序的进程执行,那么检查脚本是否已经运行会更容易运行宁。我想为我创建的子进程使用 process exit 事件,但这被证明是无用的,因为它只会 运行 一旦进程完成,但无助于检查它是否是目前运行宁。

我也考虑过 cron 作业,但似乎没有一个好方法可以在不制定基于时间的计划的情况下仅根据命令启动 cron 作业。

在另一个项目中,我使用了一个数据库并在 table 中简单地创建了一个新行来指示该脚本是否可用于 运行,当前 运行ning,或已完成.我绝对可以再次这样做,但我正在努力让这个项目尽可能轻。

最后,我确实考虑过只添加一些全局状态变量来指示进程是否 运行ning,但不确定这是否是最好的方法。

因此,如果有人知道检查子进程脚本当前是否正在 运行ning 的方法,或者有更好的方法来实现我在这里尝试实现的目标,任何方向都会有所帮助。

你可以使用一个变量,它甚至不必是全局的!

class MySingletonProcess {
  constructor() {
    this.isBusy = false;
    this.spawnProcess = this.spawnProcess.bind(this);
  }

  doProcess() {
    console.log("Doing process...");
    // fake async stuff...
    return new Promise((resolve) => {
      setTimeout(() => {
        this.isBusy = false;
        resolve();
      }, 2500);
    });
  }

  spawnProcess() {
    if (this.isBusy) {
      console.log("I'm busy!");
      return;
    } else {
      this.isBusy = true;
      this.doProcess();
    }
  }
}

const processSingleton = new MySingletonProcess();
const button = document.getElementById("button");
button.addEventListener("click", processSingleton.spawnProcess);
<button id="button">Click Me To Spawn Process</button>