如何解决如何重新启动Node.js应用程序并将新过程移交给控制台
以下Node.js脚本可以自行重启,甚至可以打印到正确的控制台(或终端,如果您愿意),但是它将不再在前台运行,因为您无法通过Ctrl退出它+ C了(请参见屏幕截图),等等:
console.log("This is pid " + process.pid);
setTimeout(function () {
process.on("exit",function () {
require("child_process").spawn(process.argv.shift(),process.argv,{
cwd: process.cwd(),detached : true,stdio: "inherit"
});
});
process.exit();
},5000);
我已经尝试过detached: true
与detached: false
,但是显然这并不能解决问题...
是否有办法使新的节点进程在前台运行,从而取代旧的?还是这不可能?
我知道在Bash中,您可以像这样从后台拉回程序:
$ watch echo "runs in background" &
$ fg # pulls the background process to the foreground
但是我不是在寻找Bash命令,而是在Node.js脚本中寻找可在任何平台上运行的编程解决方案。
解决方法
不,一旦退出某个进程,它便无法执行任何其他操作,而且对于我所听说过的终端,没有诸如“请在退出后先出现”这样的API之类的东西。
解决此问题的正确方法是通过包装器,该包装器监视过程中的故障并重新启动。然后,包装程序将控制stdio,并将其传递给其子级。
您可以通过一个简单的bash
循环,另一个node
脚本来实现此目的,或者您也可以利用the NodeJS cluster module来实现这一目的。
正如Jonny所说,您需要有一个处理应用程序运行的流程管理器。根据{{3}},spawn()
的功能类似于系统级别的popen()
,这会创建一个分叉的进程。通常 不会进入前台。另外,当父进程退出时,控制权将返回到调用进程或Shell本身。
一种流行的流程管理解决方案是PM2,可以通过npm i -g pm2
安装。 (这里没有链接到他们的站点/文档)PM2是跨平台的,但是它确实需要一个“外部”依赖关系,该依赖关系不在代码库本身内。
我也很好奇为什么要退出时以描述的方式自动重启的脚本,因为似乎只是重新运行该脚本(PM2和类似工具会这样做)产生相同的结果,而无需手动进行流程管理。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。