Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 等待process.kill终止进程_Node.js - Fatal编程技术网

Node.js 等待process.kill终止进程

Node.js 等待process.kill终止进程,node.js,Node.js,我的应用程序终止一个进程(exe文件),然后尝试用更新版本替换它,我正在使用进程。kill进程的pid,我在尝试用更新版本替换它时不断收到错误,因为exe文件仍在使用,无法删除,我已“解决”这需要等待500毫秒,但我不认为这是一个好的解决方案,我希望该方法是同步的,或者至少有一个同步对应物,就像其他fs方法一样 在node.js中还有其他方法吗?文档说明如下: 尽管此函数的名称为process.kill(),但它实际上只是一个信号发送器,就像kill系统调用一样。发送的信号可能会执行某些操作,而

我的应用程序终止一个进程(exe文件),然后尝试用更新版本替换它,我正在使用
进程。kill
进程的pid,我在尝试用更新版本替换它时不断收到错误,因为exe文件仍在使用,无法删除,我已“解决”这需要等待500毫秒,但我不认为这是一个好的解决方案,我希望该方法是同步的,或者至少有一个同步对应物,就像其他fs方法一样


在node.js中还有其他方法吗?

文档说明如下:

尽管此函数的名称为
process.kill()
,但它实际上只是一个信号发送器,就像kill系统调用一样。发送的信号可能会执行某些操作,而不是终止目标进程

对我来说,这意味着
process.kill
不会表示进程被终止,而只是表示信号已经发送(当它返回时)

但还有一条有趣的线:

如果目标pid不存在,此方法将抛出错误。作为一种特殊情况,可以使用0的信号来测试进程是否存在。如果pid用于终止进程组,Windows平台将抛出错误

所以你可以想出这样的办法:

const killProcess = ({pid, signal = 'SIGTERM', timeout} = {}) => new Promise((resolve, reject) => {
  process.kill(pid, signal);
  let count = 0;
  setInterval(() => {
    try {
      process.kill(pid, 0);
    } catch (e) {
      // the process does not exists anymore
      resolve();
    }
    if ((count += 100) > timeout) {
      reject(new Error("Timeout process kill"))
    }
  }, 100)
})

这些文件说:

尽管此函数的名称为
process.kill()
,但它实际上只是一个信号发送器,就像kill系统调用一样。发送的信号可能会执行某些操作,而不是终止目标进程

对我来说,这意味着
process.kill
不会表示进程被终止,而只是表示信号已经发送(当它返回时)

但还有一条有趣的线:

如果目标pid不存在,此方法将抛出错误。作为一种特殊情况,可以使用0的信号来测试进程是否存在。如果pid用于终止进程组,Windows平台将抛出错误

所以你可以想出这样的办法:

const killProcess = ({pid, signal = 'SIGTERM', timeout} = {}) => new Promise((resolve, reject) => {
  process.kill(pid, signal);
  let count = 0;
  setInterval(() => {
    try {
      process.kill(pid, 0);
    } catch (e) {
      // the process does not exists anymore
      resolve();
    }
    if ((count += 100) > timeout) {
      reject(new Error("Timeout process kill"))
    }
  }, 100)
})

我相信知道进程是否真的被终止的唯一方法是订阅OS事件。Node.js应该如何知道操作系统实际上释放了进程的资源,以便可以进行诸如删除进程之类的操作?我认为知道进程是否真的被终止的唯一方法是订阅操作系统事件。Node.js如何知道操作系统实际上已经释放了用于进程的资源,以便可以进行操作(如删除它)?