我想知道这是一般功能还是可以成为重启过程的功能;就像process.disconnect()
一样,但在这种情况下,它将在调用函数时重新启动脚本。
答案 0 :(得分:8)
通常,流程管理器习惯于(自动)重启进程,例如monit,PM2,nodemon,forever等。
但是,可以从进程本身重新启动,只需生成一个等待一段时间然后执行相同脚本的分离子进程。您可以将这两个命令组合起来,一个用于睡眠,另一个用于当前命令行,或者您可以简单地将睡眠合并到脚本中。后者的一个例子:
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: true
添加到spawn()
配置对象中。对于* nix,通常不需要这样做。
要记住的一件事是,如果原始进程在前台启动,任何重新启动的进程将无法再访问终端。
此外,您可以消除延迟并process.env
检查您的脚本是否不使用任何给定时间最多只能由一个进程使用的资源。
最后一点说明:如果你的进程因内存耗尽,触发C ++断言,V8错误等异常崩溃,你的进程将无法重启(即使你有一个'unhandledException'
事件处理程序设为process
)。考虑到这些情况,您几乎需要某种外部机制来重新启动该过程。
答案 1 :(得分:0)
如果您将脚本作为系统守护程序启动(例如,使用upstart或systemd),您可以process.exit()
让那些人为您重新创建新流程。