子进程不会被Node.JS杀死

时间:2011-07-26 03:12:15

标签: javascript node.js

我使用child_process.exec / child_process.spawn分叉新进程,然后使用child.kill / process.kill将其终止。它适用于简单的二进制可执行文件,例如cat / ls,子进程就会被杀死。

但是,当脚本(比如说P1) 分叉另一个子进程(比如P2)时,只有脚本解释器P1被杀,而不是子进程P2

问题:有没有办法让Node.JS杀死这样的子进程P2?

代码适用于run_and_kill('ls -Al /usr/lib'),但不适用于run_and_kill('firefox')

function run_and_kill(cmd) {
    var exec = require('child_process').exec,
        ls = exec(cmd);
    console.log('Child process started: %d', ls.pid);
    ls.on('exit', function(code, signal) {
        console.log('exit with code %s and signal %s', code, signal);
    });
    ls.kill();
}

3 个答案:

答案 0 :(得分:4)

我发现实现此目的的最安全方法是使用child.pid作为参数创建一个生成进程以终止信号。 fork示例:

var process;
process = require('child_process');

var fork, child;
fork = process.fork;
child = fork('./index');

var spawn;
spawn = process.spawn;
spawn('kill', [child.pid]);
console.log('sending SIGTERM to child process (socket server)');

我通常在规范中使用它,主要是在beforeAll / afterAll块中启动/终止服务器(在示例中' ./ index.js')。

答案 1 :(得分:1)

我认为您的 P2 既不是 P1 的分支或子代,而是由它产生的并行进程。对于Firefox(至少在Linux中),firefox应用程序由包装器shell脚本启动。如果它总是成为firefox,最好直接从它的安装文件夹中运行二进制文件

答案 2 :(得分:1)

在我的情况下,问题是该过程使用了外壳。默认情况下为/bin/sh,并且在使用该命令时不会处理终止信号。

要解决此问题,您可以改用/bin/bash

exec('your command', {
    shell: '/bin/bash',
});