2015-05-13 114 views
0

我使用spawn來創建子進程。我想創建一個子進程並在之後啓動我想退出當前進程。處理子進程開始

var Spawn = require("child_process").spawn; 

var sp = Spawn("sleep", ["10000"]);   
sp.unref();         

process.exit();        

上面的代碼工作正常:它會創建一個子進程(sleep)將活10秒,電流處理退出。

我可以肯定,當我做process.exit()sleep進程是活動的或通過結束父進程,子進程也將被終止?

在這是一個簡單的例子,process.exit()是無用的,因爲過程將結束,因爲我打電話unref。但是,這只是一個例子。

那麼,有沒有什麼事情要聽從sp(孩子的過程),告訴我嘿我活躍

在某些情況下(例如var sp = Spawn("node", ["foo", "--bar"]);),我在ps aux | grep node的輸出中看到[nodejs] <defunct>,就在產卵呼叫之後。這發生在我可以控制應用程序運行的調試模式中。這意味着這個過程還沒有活躍,我想。

+0

信號是你的朋友。 –

回答

2

io.js源,child_process.spawn()調用ChildProcess.spawn()只有在發生所有錯誤檢查後才設置.pid屬性。因此,您可以做的一件事是檢查pid屬性是否設置在由spawn()返回的對象上,如果是,那麼您可以確定您的子進程已成功啓動。

(這可能是更好的在所有的錯誤是如何傳播回仔細觀察和處理,而不是依靠pid他們。也許pid是完全可靠的,因爲你不能有一個pid沒有過程?有人誰知道更多想要評論或直接編輯此答案以改進它?)

如果您希望孩子進程在您的代碼退出後繼續運行,您將需要設置options.detached。否則,當父進程退出時,子進程將退出。

defunctps man page解釋:標

進程是死的過程(所謂的「殭屍」) 仍然存在,因爲他們的父母沒有正確地銷燬了它們。這些 過程會由init被破壞(8)如果父進程退出。」

+0

如果我能運行'child_process.spawn()'然後後立即檢查孩子進程的PID這是否意味着進程啓動是同步和阻塞的?如果對'spawn'返回的對象設置了pid,並且未設置它,例如,如果找不到該命令,則在搜索PATH時spawn必須被阻塞,文件系統被訪問等。這是正確的嗎? – rsp