2016-11-27 52 views
0

我想知道如果一個普通的函數或者可以做一個函數來重啓進程;就像process.disconnect(),但在這種情況下,它將在調用函數時重新啓動腳本。Node.js進程重啓

+2

不,不管怎麼說,你都不應該在流程之外做這件事。你可以'process.exit'。 –

回答

3

一般流程管理器是用來(自動)重啓過程,如monit的,PM2,nodemon,永遠等

但是,您能夠從過程本身重啓通過簡單地生成一個分離的子進程等待一段時間,然後執行相同的腳本。您可以將它作爲兩個命令的組合,一個用於睡眠,另一個用於當前的命令行,或者您可以簡單地將睡眠併入您的腳本。後者的一個例子:

var spawn = require('child_process').spawn; 

(function main() { 

    if (process.env.process_restarting) { 
    delete process.env.process_restarting; 
    // Give old process one second to shut down before continuing ... 
    setTimeout(main, 1000); 
    return; 
    } 

    // ... 

    // Restart process ... 
    spawn(process.argv[0], process.argv.slice(1), { 
    env: { process_restarting: 1 }, 
    stdio: 'ignore' 
    }).unref(); 
})(); 

在Windows上,你可能需要添加detached: truespawn()配置對象,但。對於* nix,通常不需要。

但要注意的一點是,如果原始進程在前臺啓動,任何重新啓動的進程都將無法再訪問終端。

此外,您可以消除延遲,並檢查您的腳本是否不使用任何只能在任何給定時間最多隻能使用一個進程的資源的process.env

最後一點:如果你的進程崩潰異常,由於內存耗盡,引發了C++斷言,一個V8的bug等等,你的過程將不會很明顯(即使你有一個'unhandledException'事件處理程序process設置重新啓動)。爲了解決這些情況,您幾乎需要某種外部機制來重新啓動進程。

+0

包含'detached:true'的額外Karma點數!謝謝,我不知道! – amenthes

0

如果您將腳本作爲系統守護進程啓動(例如使用upstart或systemd),那麼您可以僅使用process.exit(),並讓那些負責爲您重新創建新進程。

+0

'process.exit()'只是關閉腳本,我需要用命令重新啓動腳本。 – Maxsanc1