[英]Child process not getting killed with Node.JS
我使用child_process.exec
/ child_process.spawn
来分叉一个新进程,然后使用child.kill
/ process.kill
其child.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();
}
我发现实现这一目标的最安全的方法是使用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'中)。
我认为你的P2不是P1的分叉或子代,而是由它产生的并行过程。 对于Firefox(至少在Linux中),firefox应用程序由包装器shell脚本启动。 如果它总是成为firefox,那么最好直接从它的安装文件夹中运行二进制文件
在我的情况下,问题是用于进程的shell。 默认情况下它是/bin/sh
,当使用它时它没有处理终止信号。
要解决此问题,您可以使用/bin/bash
代替:
exec('your command', {
shell: '/bin/bash',
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.