簡體   English   中英

從作為子進程運行的腳本將節點作為后台進程運行

[英]Run node as background process from script running as child process

我正在端口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 &

現在,node @ 5200具有testscript的父代,而后者又具有node @ 5100的父代。 當我殺死node @ 5100的PID時,一切都停止了。

我希望當testscript和node @ 5100退出時,node @ 5200仍能運行。

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

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

編輯:文檔說:

使用detached選項啟動長時間運行的進程時,除非該進程提供了未連接到父級的stdio配置,否則該進程將不會在后台運行。 如果父代的stdio被繼承,則子代將保持與控制終端的連接。

因此,您必須編寫如下代碼:

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

child.unref();

或者,您可以使用他們的示例將stdout重定向到文件等。

當我從運行一次的文件中生成一個進程時,由於父文件正常退出,所以我的子進程具有完美的行為。 由於我正在通過服務器文件生成進程而引發問題,該服務器文件被Ctrl + c殺死,因此它在退出時給出了錯誤代碼,結果整個進程組都得到了SIGTERM,導致殺死了子進程。

為了成功實現生成,我使用了雙重生成,即從服務器文件中生成了一個子進程,進一步生成了運行其他節點服務器的child_process。 因此,我能夠避免SIGTERM接觸孫子並滿足我的要求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM