为什么我不能在windows上的nodejs中杀死我的子进程?

Nic*_*ros 16 winapi signals process node.js

exec = require('child_process').exec;

child = exec('node child.js');
child.stdout.pipe(process.stdout);
child.kill('SIGKILL');

function wait() {
    setTimeout(wait, 1000);
    child.kill('SIGKILL');
}
wait();
Run Code Online (Sandbox Code Playgroud)

上面的代码不起作用.孩子开始并将继续无限期地写出输出.我无法弄清楚如何杀死这个子进程.我在Windows 7中运行节点v0.11.9.我知道Windows不使用POSIX信号,但发送它'WM_QUIT'会导致异常.是我在stdin上设置事件协议的最佳解决方案吗?

小智 34

对于我当前接受的答案,这仍然不起作用.在Windows上可以使用的解决方法是调用Windows taskkill程序来为您杀死子进程.不太好,但它的工作原理.当您生成子项时,您将获得存储在生成时返回的子对象中的ProcessID(pid),您可以使用taskkill来终止该进程.

var spawn = require('child_process').spawn;    
spawn("taskkill", ["/pid", child.pid, '/f', '/t']);
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!我花了整整一天的时间试图弄清楚如何杀死一个进程,这是唯一有效的方法.我真的尝试过其他每一种选择.非常感谢! (2认同)

Som*_*ens 7

如果您希望能够通过 杀死子进程SIGKILL,请改用spawnasspawn将创建一个子进程(而不是像这样的新 shell exec

var exec = require('child_process').spawn;
Run Code Online (Sandbox Code Playgroud)

或者,您可以将timeout参数传递给exec,这将在几毫秒后终止进程。

child = exec('node child.js', { timeout: 1000 });
Run Code Online (Sandbox Code Playgroud)


Ada*_*hns 7

我不得不使用以下包来终止我的子进程:

https://www.npmjs.com/package/tree-kill

常规 .kill 命令在树莓派上对我不起作用。


Che*_*uCR 5

只是更新

现在此代码可以运行(使用 Node.js 8.9.3 和 Windows 10 进行测试):

spawn = require('child_process').spawn;
child = spawn('node', ['child.js']);

setTimeout(function() {
    child.kill();
    }, 5000
);
Run Code Online (Sandbox Code Playgroud)