2014-12-24 51 views
1

我在端口5100上運行節點服務器。它執行一個shell腳本作爲子進程,從而啓動另一個節點服務器。運行節點作爲後臺進程從作爲子進程運行的腳本

var execFile = require('child_process').execFile; 
execFile("./testscript", args, {cwd: cwd}, function (error, stdout, stderr) { 
    console.log("error.." + error); 
    console.log("stdout.." + stdout); 
    console.log("stderr.." + stderr); 
}) 

在劇本我被nohup的運行的節點過程:

nohup node server.js PORT=5200 2>/dev/null 1>/dev/null & 

現在節點@ 5200有testscript的parentid這反過來節點@ 5100的parentId的。 當我殺死節點@ 5100的PID時,一切都停止。

我希望node @ 5200在testscript和node @ 5100退出時仍然運行。

回答

2

當我產生了過程從文件跑了一次,我的孩子進程有完美的行爲,因爲父文件正常退出。 問題引發了我由一個被Ctrl + c殺死的服務器文件產卵的過程,所以它在退出時給出了一個錯誤代碼,結果整個進程組都得到了SIGTERM,導致了子進程被終止。

爲成功實施產卵,我用雙產卵即從進一步催生child_process跑我的其他節點的服務器我的服務器文件催生了一個子進程。所以我能夠避免SIGTERM達到孫子並滿足我的要求。

+0

child.unref()不起作用。 – vashishatashu

2

您需要在創建子進程時設置detached選項。這有點像nohup。請參閱此處的文檔:http://nodejs.org/api/child_process.html#child_process_options_detached

這樣做是爲了使子進程成爲新「進程組」的領導者,因此,當父進程組死亡時,子進程可以繼續運行。

編輯:文件說:

當使用分離選項來啓動一個長期運行的進程,該進程將不會留在後臺運行,除非它帶有未連接的標準輸入輸出配置給父母。如果父母的stdio被繼承,則孩子將繼續與控制終端連接。

所以你必須這樣寫代碼:

var child = spawn(cmd, args, {detached: true, stdio: ['ignore', 'ignore', 'ignore']}); 

child.unref(); 

或者你可以用自己的例子有標準輸出重定向到一個文件,等等

+0

child.unref()不能正常工作。孩子不分離。 – vashishatashu

+0

@vashishatashu:我已經用基於文檔的完整,經過測試的代碼更新了我的答案。您唯一遺漏的部分可能是'stdio'選項。 –

+0

我解決了這個問題,並在答案中提供詳細信息。我並沒有錯過stdio。 – vashishatashu

相關問題