微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何重新启动Node.js应用程序并将新过程移交给控制台

如何解决如何重新启动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: truedetached: false,但是显然这并不能解决问题...

是否有办法使新的节点进程在前台运行,从而取代旧的?还是这不可能?

我知道在Bash中,您可以像这样从后台拉回程序:

  $ watch echo "runs in background" &
  $ fg # pulls the background process to the foreground

但是我不是在寻找Bash命令,而是在Node.js脚本中寻找可在任何平台上运行的编程解决方案。

enter image description here

解决方法

不,一旦退出某个进程,它便无法执行任何其他操作,而且对于我所听说过的终端,没有诸如“请在退出后先出现”这样的API之类的东西。

解决此问题的正确方法是通过包装器,该包装器监视过程中的故障并重新启动。然后,包装程序将控制stdio,并将其传递给其子级。

您可以通过一个简单的bash循环,另一个node脚本来实现此目的,或者您也可以利用the NodeJS cluster module来实现这一目的。

,

正如Jonny所说,您需要有一个处理应用程序运行的流程管理器。根据{{​​3}},spawn()的功能类似于系统级别的popen(),这会创建一个分叉的进程。通常 不会进入前台。另外,当父进程退出时,控制权将返回到调用进程或Shell本身。

一种流行的流程管理解决方案是PM2,可以通过npm i -g pm2安装。 (这里没有链接到他们的站点/文档)PM2是跨平台的,但是它确实需要一个“外部”依赖关系,该依赖关系不在代码库本身内。

我也很好奇为什么要退出时以描述的方式自动重启的脚本,因为似乎只是重新运行该脚本(PM2和类似工具会这样做)产生相同的结果,而无需手动进行流程管理。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。