javascript - 在 node.js 中生成并终止一个进程

标签 javascript 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.js
Timeout
kill

但是我仍然需要发送 ctrl+C 来结束程序。我错过了什么?

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

我试过了:

  • 为应用添加了 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 的所有 child ,我不知道这样使用 spawn 是错误的还是代码不起作用。

我所做的最后一个编辑是很好的答案,但必须稍微编辑一下。

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

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

我是这样开始的:

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

而不是 child.kill

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

我会接受任何以更简洁的方式或更好的方式而不需要执行文件的答案。

最佳答案

请参阅 this discussion

一旦你开始在标准输入上监听数据, Node 将等待标准输入上的输入,直到它被告知不要。当用户按下 ctrl-d(表示输入结束)或程序调用 stdin.pause() 时, Node 停止等待 stdin。

Node 程序不会退出,除非它无事可做或等待。发生的事情是,它正在等待标准输入,因此永远不会退出。

尝试将您的 setTimeout 回调更改为

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

我希望这会奏效。

关于javascript - 在 node.js 中生成并终止一个进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18694684/

相关文章:

javascript - 如何将图像传递给函数 Ionic 2

node.js - 如何使用 sequelize 进行 3 个连接?

node.js - 根据 Node 版本有条件地导入 Node 模块

node.js - Nodejs Express sendStatus 错误

node.js - 如何获取数据到ejs文件?

node.js - 没有密码字段的护照登录身份验证

javascript - 在父元素之后稍微淡化子元素

javascript - 基本的 Javascript 登录

javascript - 从选择下拉列表中创建查询字符串链接?

javascript - 使用 js 或 jQuery 强制将 HTML 输入字段中的空格转换为 %20