2013-04-10 79 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); 

終止整個進程組。