我有一个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,我认为这与它是一个管道有关吗?avconv
添加一个来可靠地杀死第一个孩子(signal.pid
),但第二个过程的PID(可能是因为它是sudo)与{{{ 1}}因此,如果不编制精心设计的signal.pid
语法我还尝试使用节点top | grep
模块终止进程:
process
也不起作用。
我怀疑管道bash进程在某种程度上是独一无二的,但是我在bash结束时有点超出了我的联盟!
答案 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);
终止整个流程组。