Node.js exec:杀死子管道及其所有子管道的最佳方法

时间:2013-04-10 01:33:14

标签: bash node.js

我有一个bash命令,用于将来自avconv / ffmpeg的音频流管道到另一个必须使用sudo运行的bash脚本:

avconv -i http://8273.live.streamtheworld.com:3690/WQHTFMAAC_SC -f wav -ac 1 -ar 22050 - | sudo ./pifm -

node.js脚本用于不时停止脚本:

var exec = require("child_process").exec,
    signal = null;

var signal = exec("avconv -i http://8273.live.streamtheworld.com:3690/WQHTFMAAC_SC -f wav -ac 1 -ar 22050 - | sudo ./pifm -")
setTimeout(function() {
    signal.kill('SIGINT')
},10000)

不幸的是,这不会杀死管道中的任何一个进程。

更多信息:

  • 管道进程的结果PID(console.log(signal.pid))不代表任何一个进程的PID,我认为这与它是一个管道有关吗?
  • 我能够通过向avconv添加一个来可靠地杀死第一个孩子(signal.pid),但第二个过程的PID(可能是因为它是sudo)与{{{ 1}}因此,如果不编制精心设计的signal.pid语法
  • ,就无法可靠地杀死
  • 我还尝试使用节点top | grep模块终止进程:

    process

    也不起作用。

  • 我宁愿避免在两个进程之间使用Node来管道,因为我在低内存环境中运行它

我怀疑管道bash进程在某种程度上是独一无二的,但是我在bash结束时有点超出了我的联盟!

2 个答案:

答案 0 :(得分:0)

我记得我遇到了类似的问题并通过使用awk推送命令解决了这个问题,

awk '{system("avconv -i http://8273.live.streamtheworld.com:3690/WQHTFMAAC_SC -f wav -ac 1 -ar 22050 - | sudo ./pifm -")}'
PID=$!


setTimeout(function() {
    sudo kill $PID #(Can try to force it with kill -9 instead)
},10000)

这样你真的杀死了拥有该命令的进程。我不确定它在你的背景下是否会起作用。告别朋友希望我帮助你了!

答案 1 :(得分:0)

尝试

process.kill(-signal.pid);

终止整个流程组。