2014-03-30 30 views
1

我正在使用spawn函數與mjpg_streamer。但是,子進程一旦創建就立即退出。下面是我使用node.js產卵。退出事件立即發射

streamingProcess = spawn('mjpg_streamer', [ 
    '-i', '"/usr/local/lib/input_file.so -f ' + IMAGE_PATH + ' -n ' + IMAGE_NAME + '"', 
    '-o', '"/usr/local/lib/output_http.so -w /usr/local/www"' 
]); 

streamingProcess.on('exit', function(code, signal) { 
    console.log('streaming process has stopped. Code: ' + code + ', signal: ' + signal); 
    streamingProcess = null; 
}); 

運行的實際命令本身的代碼返回如下:

enter image description here

什麼mjpg_streamer命令實際上做的是火了一個網絡服務器。退出回調中的代碼是1,信號是null

不太清楚是怎麼回事...

UPDATE:

如果我使用exec,然後正常工作!但是,如果我叫殺,這個過程不會死!

所以

streamingProcess = exec('LD_LIBRARY_PATH=/usr/local/lib mjpg_streamer -i "input_file.so -f /tmp/stream -n pic.jpg" -o "output_http.so -w /usr/local/www"'); 

確實火起來的網絡服務器,但現在如果我叫

streamingProcess.kill() 

退出事件觸發,但過程本身不會死。在進一步的檢查中,似乎pid(從節點子進程和os上)不一樣?

現在我很困惑...

更新2:

好吧,我想我開始明白是怎麼回事exec。所以它在一個子shell中執行命令,這對我來說是創建兩個進程。一個是subhell,另一個是mjpg_streamer命令本身。所以殺死exec只會殺死子shell。但是mjpg_streamer仍然存在。

從節點:

enter image description here

從OS:

enter image description here

所以3752是實際的命令我要殺死。我想沒有辦法讓我從節點獲得這個pid? :)

回答

2

您的spawn調用執行命令,但命令失敗(退出代碼1)。我相信這是由於在你傳遞的命令中出現額外的引號。在使用shell時,必須使用雙引號,以便shell不會拆分包含空格的參數。當你使用spawn時,你不能使用它們。所以:

streamingProcess = spawn('mjpg_streamer', [ 
    '-i', '/usr/local/lib/input_file.so -f ' + IMAGE_PATH + ' -n ' + IMAGE_NAME, 
    '-o', '/usr/local/lib/output_http.so -w /usr/local/www' 
]); 

我在上面的命令中刪除的唯一東西是雙引號。

exec的pid問題是Node獲取啓動你命令的shell的pid而不是你的命令本身的pid。(這也解釋了爲什麼,就像在命令行鍵入命令一樣,exec需要雙引號以防止參數被拆分。)

總之,spawn不使用shell,不要使用引號來防止空白分割,並且你得到的pid是你的命令的pid。但是,exec啓動一個shell來執行該命令,因此需要引號,並且您將獲得shell的pid。

+0

DUDE。非常感謝! – Umair