我有一個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的過程在某種程度上是獨一無二的,但我我的聯盟中有些事情結束了!
我想'signal'的PID將代表爲了運行命令而創建的shell。這將是有道理的,shell啓動的第一個進程將是PID + 1.你會認爲殺死shell會終止它啓動的進程,但我從來沒有嘗試過與節點,也許sudo干擾你嘗試終止它。您是否嘗試過使用節點進行分析來管道流以驗證您的內存使用情況? – 2013-04-10 04:05:33
我還沒有嘗試過使用節點進行管道操作,主要是因爲管道飼料是永久性的大型(高帶寬音頻),因此填充Node Node看起來比在較低級別上做的更不理想。我會嘗試它,看看我最終結束了! – 2013-04-10 21:26:32
在你的腳本中,你殺死了變量而不是它啓動的命令。 – Franko 2013-06-12 18:46:33