2016-06-15 84 views
1

讓我們看到的現象第一,爲什麼產卵的NodeJS進程成爲<defunct>直到父母離開

代碼的NodeJS:

const cp = require('child_process'); 

var ls = cp.spawn('ls', ['/']); 

ls.stdout.on('data', (data) => { 
    console.log(`stdout: ${data}`); 
}); 

ls.stderr.on('data', (data) => { 
    console.log(`stderr: ${data}`); 
}); 

ls.on('close', (code) => { 
    console.log(`child process closed with code ${code}`); 
}); 

while(true){} 

運行該代碼的NodeJS,什麼都不顯示,似乎被觸發任何事件。

然後運行 ​​「PS -ef | grep的LS | GRPE -v grep的」 在另一外殼,結果是:

liyuanq+ 10995 10990 0 11:06 pts/3 00:00:00 [ls] <defunct> 

如果刪除代碼:

while(true){} 

節點過程退出,並觸發開啓數據事件。

的問題是,爲什麼不點關閉衍生的進程時,它實際上完成了它的任務,直到父節點處理退出。

我的環境:

OS:Debian的8.4 x86_64的

節點:V6.1.0

回答

2

非常有趣的現象,謝謝!

如果執行等待()的孩子一個專門的線程,這種情況就不會發生

如果有孩子退出之間的間隙和家長進行等待(),孩子會看到在這個差距內不存在。

在節點中,因爲我們只有一個線程,並且正在執行無限循環,所以無法進入事件循環,攔截子出口並從任務列表中清除子進程號。

如果用長延遲的setTimeout取代你而真循環,該線程將獲得免費的CPU,等待孩子從任務列表中清除它 - 我已經驗證了。

希望這會有所幫助。

+0

我的上帝!解決了!謝謝! –