2013-04-10 85 views
3

我有一个bash命令管道从avconv/ffmpeg的另一个bash脚本必须使用sudo运行的音频流:Node.js的EXEC:杀子管最佳途径,它的所有子

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.pid不相关,因此不可能在不调制的情况下可靠地杀死阐述top | grep语法
  • 我也尝试使用节点process模块查杀过程:

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

    这也不能工作。

  • 我宁愿避免使用节点来管这两个进程之间,因为我这运行在低内存环境

我怀疑是管道bash的过程在某种程度上是独一无二的,但我我的联盟中有些事情结束了!

+1

我想'signal'的PID将代表为了运行命令而创建的shell。这将是有道理的,shell启动的第一个进程将是PID + 1.你会认为杀死shell会终止它启动的进程,但我从来没有尝试过与节点,也许sudo干扰你尝试终止它。您是否尝试过使用节点进行分析来管道流以验证您的内存使用情况? – 2013-04-10 04:05:33

+0

我还没有尝试过使用节点进行管道操作,主要是因为管道饲料是永久性的大型(高带宽音频),因此填充Node Node看起来比在较低级别上做的更不理想。我会尝试它,看看我最终结束了! – 2013-04-10 21:26:32

+0

在你的脚本中,你杀死了变量而不是它启动的命令。 – Franko 2013-06-12 18:46:33

回答

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) 

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

0

尝试

process.kill(-signal.pid); 

终止整个进程组。