在node.js中生成并杀死进程
我试图在javascript中生成一个进程,并在一段时间后将其杀死(出于测试目的)。
最后,该过程将是一个无限循环,我需要在指定的时间使用不同的参数重新启动,因此我认为生成该过程并杀死它是执行此操作的最佳方法。
我的测试代码是:
var spawn=require('child_process').spawn, child=null;
child=spawn('omxplayer', ['test.mp4'], function(){console.log('end');}, {timeout:6000});
console.log('Timeout');
setTimeout(function(){
console.log('kill');
child.kill();
}, 1200);
child.stdout.on('data', function(data){
console.log('stdout:'+data);
});
child.stderr.on('data', function(data){
console.log('stderr:'+data);
});
child.stdin.on('data', function(data){
console.log('stdin:'+data);
});
结果是:
#~$ node test.jsTimeout
kill
但是我仍然需要发送ctrl + C来结束程序。我想念什么?
在Raspbian的节点0.10.17上,omxplayer是二进制文件(视频播放器)。
我试过了:
- 已添加
chmod +x
到应用程序。 - 以root身份启动。
- 子进程的标准输入暂停。在kill命令中使用所有与终止相关的信号。
ps
在应用运行时,我还启动了一个命令:
2145 bash2174 node
2175 omxplayer
2176 omxplayer.bin
2177 ps
因此,omxplayer是一个包装器,结束时谁不会杀死它的子进程,是否有任何方法可以获取包装后的进程的pid?
仍然咬灰尘,尝试了这个:
spawn('kill', ['-QUIT', '-$(ps opgid= '+child.pid+')']);
我以为会杀死omxplayer的所有子级,我不知道使用这样的spawn是错误的还是代码不起作用。
我所做的最后一个编辑是一个很好的答案,但是必须进行一些编辑。
我创建了一个sh文件(具有执行权限),如下所示:
PID=$1PGID=$(ps opgid= "$PID")
kill -QUIT -"$PGID"
我是这样开始的:
execF('kill.sh', [child.pid], function(){ console.log('killed');
});
代替child.kill
。
我不确定这是否是最好的方法,也不确定代码是否干净,但确实有效。
我会接受任何更干净或更有效的答案,而不必执行文件。
回答:
参考此讨论
一旦开始在stdin上侦听数据,node将等待在stdin上的输入,直到被告知不这样做为止。当用户按下ctrl-d(表示输入结束)或程序调用stdin.pause()时,节点将停止等待stdin。
除非没有任何事情要做或等待,否则节点程序不会退出。发生的是,它在标准输入上等待,因此永不退出。
尝试将setTimeout回调更改为
console.log('kill');child.stdin.pause();
child.kill();
我希望它能起作用。
以上是 在node.js中生成并杀死进程 的全部内容, 来源链接: utcz.com/qa/418034.html