2017-06-14 53 views
0

我的目標是在從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文件不得到來自子進程的標準輸出 - 所以我知道它被重定向。但是,closeexit事件中的代碼仍然不會執行。然後我想我可以檢測到寫入out_log文件的時間,在這種情況下,我將能夠在那一刻執行代碼。但是,我無法弄清楚如何做到這一點。有什麼建議麼?

回答

1

您可以將偵聽器添加到'close'事件,例如用'close'替換'exit'。它甚至在'忽略'stdio的情況下也在我的身邊工作。此外,回調中的輸入參數是退出代碼號或null。

根據退出並關閉事件之間文檔的NodeJS區別:當 已經關閉子進程的標準輸入輸出流發出

「關閉」事件。這與「退出」事件有所不同,因爲多個進程可能共享相同的stdio流。

希望它有幫助。

+0

我將其更改爲「close」,並且仍然沒有將日誌文件寫入桌面的運氣。我認爲這可能與寫入桌面的一些權限問題有關,但我懷疑它,因爲如果我使用子進程的''inherit'',則文件將寫入桌面。關於你的關於「輸入參數」的陳述,你指的是'data'參數嗎?我會嘗試刪除它。 – ariestav

+0

是的,我的意思是'data'參數,但它並不重要,只需注意。您是否檢查過,如果您通過「忽略」參數啓動該過程?我有類似的情況,問題在於等待子進程的輸入流,子進程沒有做任何事情。 – DLyman

+0

我知道確實如此,通過檢查子進程所做的macOS上的「活動監視器」應用程序,事實上,當我爲stdio''鍵使用「ignore」值時啓動。我很茫然。有任何想法嗎? – ariestav

相關問題