为什么我无法在Windows上的nodejs中杀死我的子进程?

问题描述 投票:0回答:6
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();

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

node.js winapi process signals
6个回答
53
投票

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

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

10
投票

我必须使用以下包来终止我的子进程:

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

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


7
投票

如果您希望能够通过

SIGKILL
终止子进程,请使用
spawn
,因为
spawn
将创建一个子进程(而不是像
exec
这样的新 shell:

var exec = require('child_process').spawn;

或者,您可以将

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

child = exec('node child.js', { timeout: 1000 });

5
投票

只是更新

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

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

setTimeout(function() {
    child.kill();
    }, 5000
);

0
投票

检查这个代码,它对我有用。


    var Killer = require('child_process');

    Killer=exec('taskkill /F /pid '+child.pid);


这里的 Killer 是一个变量,child 是你的子进程。 当您创建子进程时,它有许多与之关联的属性,pid 就是其中之一。 有关子进程属性和功能的更多详细信息,请检查此node.js子进程

此程序是在windows环境下杀死子进程的程序。


0
投票

macOS下没有问题。在Windows下,kill只能退出进程,不能关闭进程。 Windows下需要手动

destroy

const cp = require('child_process').spawn('your code')

// add this code
cp.stdout.destroy()
cp.stdin.destroy()
cp.stderr.destroy()
cp.kill()
© www.soinside.com 2019 - 2024. All rights reserved.