4

我有一个 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)

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

一些进一步的信息:

  • 管道进程 ( console.log(signal.pid)) 的结果 PID 不代表任何一个进程的 PID,我认为这与它是管道的事实有关?
  • 我能够avconv通过在 中添加一个来可靠地杀死第一个孩子 ( ) signal.pid,但是第二个进程的 PID(可能是因为它是 sudo )signal.pidtop | grep
  • process我还尝试使用节点模块终止进程:

    process.kill(this.current.pid,'SIGINT');
    

    这也不起作用。

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

我怀疑管道 bash 进程在某些方面是独一无二的,但我对 bash 的结局有点不满意!

4

2 回答 2

1

尝试

process.kill(-signal.pid);

终止整个进程组。

于 2013-09-16T11:30:36.530 回答
1

我只记得我有一个类似的问题并通过使用 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)

这样你就真的杀死了拥有该命令的进程。我不确定它是否会在您遇到困难的情况下起作用。告别朋友希望我帮助你!

于 2013-06-12T18:54:53.453 回答