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

Node.js 为什么我不能在windows上的nodejs中杀死我的子进程?,node.js,winapi,process,signals,Node.js,Winapi,Process,Signals,上述代码不起作用。子进程开始并将继续无限期地写入输出。我不知道如何杀死这个子进程。我正在Windows 7中运行节点v0.11.9。我知道Windows不使用POSIX信号,但发送“WM_QUIT”会导致异常。在stdin上设置事件协议的最佳解决方案是什么?如果您希望能够通过SIGKILL杀死子进程,请改用,因为spawn将创建子进程(而不是像exec这样的新shell): exec = require('child_process').exec; child = exec('node chi

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

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

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();
或者,您可以将
timeout
参数传递给
exec
,这将在数毫秒后终止进程

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

对于当前接受的答案,这仍然不适用于我。在windows上,您可以使用的一种解决方法是调用windows taskkill程序为您终止子进程。虽然不太好,但它仍然有效。当您生成子进程时,您将获得一个ProcessID(pid)存储在生成时返回的子对象中,可以与taskkill一起使用以终止进程

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

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

var spawn = require('child_process').spawn;    
spawn("taskkill", ["/pid", child.pid, '/f', '/t']);
var killer=require('child_process'); killer=exec('taskkill/F/pid'+child.pid);
这里killer是一个变量,child是您的子进程。 创建子进程时,它有许多与之关联的属性,pid就是其中之一。 有关子进程属性和函数的更多详细信息,请检查此项


此程序用于在windows环境中杀死子进程。

我必须使用以下程序包杀死我的子进程:

常规的.kill命令在raspberry pi上也不适用于我。

只是一个更新

现在这段代码可以工作了(使用Node.js 8.9.3和Windows 10进行了测试):


这有什么关系?
exec
是建立在spawn和ChildProcess的两个返回实例上的,这意味着
child.kill
函数对两者都是相同的。这是有效的。我仍然有点不确定exec和spawn有什么不同,如果与C exec不同,它没有覆盖父进程内存。exec子进程继续运行的事实在其父进程的旁边异步地接收信号输入,但不能像派生进程那样接收信号输入对我来说是个谜。也许exec.kill应该是未定义的,或者抛出异常“如果要发送信号,请使用派生”。请向我解释node exec vs spawn的内部结构。@NickSotiros更新了答案。如果它回答了您的问题,请向上投票并接受。在我的mac上,运行exec和not spawn可以正常工作,但在windows上不行。不过,我现在有另一个问题,我想执行“coffee--nodejs--harmony\u child.coffee”咖啡似乎正在分叉另一个节点子节点,然后它就变成了僵尸。所以我回到了第一步。为什么要在后台运行某个东西并在需要的时候杀死它会如此困难呢?我在windows 8.1中,在节点0.10.25上测试了SIGKILL,它可以工作。我相信node实际上在windows中模拟了SIGKILL。所以理论上,代码是它可以很好地工作。但是它不能。它在我的mac电脑上工作。看起来,我认为它没有在windows上正确地模拟发送信号。谢谢!我花了整整一天的时间试图弄清楚如何终止进程,这是唯一有效的方法。我尝试了其他所有方法。非常感谢!
child.kill
ce
v0.1.90
。这应该是答案。好的,那么你能投票表决吗?谢谢@DushyantBangalI,我相信这是可行的,因为节点会根据接收到的信号进行操作,而基于Windows的程序通常不会。根据我的经验,产生了Windows进程接收退出但不会关闭。这对shelljs非常有效,例如:
const kill=require('tree-kill');
let process=shell.exec(“后台运行的某个命令”{async:true});
kill(process.pid);
var killer = require('child_process'); killer=exec('taskkill /F /pid '+child.pid);
spawn = require('child_process').spawn;
child = spawn('node', ['child.js']);

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