在 Node.js 中生成并终止进程

2024-03-21

我正在尝试在 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.js
Timeout
kill

但我仍然需要发送ctrl+C来结束程序。我缺少什么?

在 Raspbian,节点 0.10.17 上,omxplayer 是一个二进制文件(视频播放器)。

I tried:

  • Added chmod +x到应用程序。
  • 以 root 身份启动。
  • 已暂停子进程的标准输入。在kill 命令中使用所有与终止相关的信号。

我还推出了一个ps应用程序运行时的命令:

2145    bash
2174    node
2175    omxplayer
2176    omxplayer.bin
2177    ps

所以 omxplayer 是一个包装器,它结束时不会杀死它的子进程,有什么方法可以获取包装进程的 pid 吗?

仍然咬着灰尘,尝试了这个:

spawn('kill', ['-QUIT', '-$(ps opgid= '+child.pid+')']);

我认为这会杀死 omxplayer 的所有子级,我不知道这样使用 spawn 是否错误,或者代码是否不起作用。

我所做的最后一次编辑是很好的答案,但必须进行一些编辑。

我创建了一个 sh 文件(具有执行权),如下所示:

PID=$1
PGID=$(ps opgid= "$PID")
kill -QUIT -"$PGID"

我是这样开始的:

execF('kill.sh', [child.pid], function(){
    console.log('killed');
});

代替child.kill.

我不确定这是否是最好的方法,也不知道代码是否干净,但它确实有效。

我会接受任何以更干净的方式实现的答案,或者甚至更好,而无需执行文件。


参考这次讨论 https://groups.google.com/forum/#!topic/nodejs/U_O5wlwfq2c

一旦开始侦听标准输入上的数据,节点将等待标准输入上的输入,直到被告知不要这样做。当用户按下 ctrl-d (意味着输入结束)或程序调用 stdin.pause() 时,节点停止等待 stdin。

节点程序不会退出,除非它没有什么可做或等待的。发生的情况是,它正在等待标准输入,因此永远不会退出。

尝试将 setTimeout 回调更改为

console.log('kill');
child.stdin.pause();
child.kill();

我希望这应该有效。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Node.js 中生成并终止进程 的相关文章