我的目標是在從NodeJS應用程序生成分離的未引用子進程後執行一些代碼。下面是我的代碼:如何在生成,分離的子進程從NodeJS退出後執行代碼
var child_options = {
cwd : prj
, env : {
PATH: cmd_directory
}
, detatched : true
, stdio : 'ignore'
};
//Spawn a child process with myapp with the options and command line params
child = spawn('myapp', params_array, child_options, function(err, stdout, stderr){
if (err) {
console.log("\t\tProblem executing myapp =>\n\t\t" + err);
} else {
console.log("\t\tLaunched myapp successfully!")
}
});
//Handle the child processes exiting. Maybe send an email?
child.on('exit', function(data) {
fs.writeFile(path.resolve("/Users/me/Desktop/myapp-child.log"), "Finished with child process!");
});
//Let the child process run in its own session without parent
child.unref();
所以exit
處理程序中的功能似乎並沒有當子進程結束得到執行。在子進程退出之後,即使分離並調用.unref()
方法時,是否還有任何方法可以執行代碼?
需要注意的是,如果我從'ignore'
到'inherit'
更改child_options
對象的'stdio'
鍵值,則exit
處理程序執行。
任何想法?
更新零件1
所以,我還是不明白這一個。我重新回到了NodeJS文檔中,並注意到有關產生「長期運行流程」的例子。在一個示例中,他們將子進程的輸出重定向到文件,而不是僅爲'stdio'
選項使用'ignore'
。所以我改變了child_options
對象如以下內'stdio'
關鍵,但很可惜我還是沒能在'close'
或'exit'
事件中執行代碼:
var out_log = fs.openSync(path.resolve(os.tmpdir(), "stdout.log"), 'a'),
err_log = fs.openSync(path.resolve(os.tmpdir(), "stderr.log"), 'a');
var child_options = {
cwd : prj
, env : {
PATH: cmd_directory
}
, detatched : true
, stdio : ['ignore', out_log, err_log]
};
因此,stdout.log文件不得到來自子進程的標準輸出 - 所以我知道它被重定向。但是,close
或exit
事件中的代碼仍然不會執行。然後我想我可以檢測到寫入out_log
文件的時間,在這種情況下,我將能夠在那一刻執行代碼。但是,我無法弄清楚如何做到這一點。有什麼建議麼?
我將其更改爲「close」,並且仍然沒有將日誌文件寫入桌面的運氣。我認爲這可能與寫入桌面的一些權限問題有關,但我懷疑它,因爲如果我使用子進程的''inherit'',則文件將寫入桌面。關於你的關於「輸入參數」的陳述,你指的是'data'參數嗎?我會嘗試刪除它。 – ariestav
是的,我的意思是'data'參數,但它並不重要,只需注意。您是否檢查過,如果您通過「忽略」參數啓動該過程?我有類似的情況,問題在於等待子進程的輸入流,子進程沒有做任何事情。 – DLyman
我知道確實如此,通過檢查子進程所做的macOS上的「活動監視器」應用程序,事實上,當我爲stdio''鍵使用「ignore」值時啓動。我很茫然。有任何想法嗎? – ariestav