我使用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();
}
答案 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',
});