使用一个bash脚本运行两个节点服务器并接收控制台日志

时间:2017-11-20 10:53:29

标签: node.js bash

我有一个bash脚本:

node web/dist/web/src/app.js & node api/dist/api/src/app.js &

$SHELL

它成功启动了我的节点服务器。但是:

  1. 我的终端窗口中没有收到任何输出(来自console.log等)
  2. 如果我通过(Ctrl + C)取消,则不会退出进程,因此我烦恼地必须在之后手动执行taskkill / F / PID等。
  3. 到底有没有?

1 个答案:

答案 0 :(得分:1)

使用 Ctrl + C 停止后台作业的原因是因为信号(在这种情况下为SIGINT)仅由前台进程接收。

当您的前台进程(非交互式主脚本)退出时,其子进程变为orphansinit进程立即采用这些进程。要杀死他们,你需要他们的PID。 (当您在交互式shell 中运行后台进程时,它将收到SIGHUP,并可能在shell退出时退出。)

您的案例中的解决方案是使用shell内置wait命令使您的脚本等待其子级wait将确保您的脚本收到SIGINT,然后您可以使用trap处理该文件并使用kill 0删除后台作业:

#!/bin/bash

trap 'kill 0' EXIT

node app1.js &
node app2.js &

wait

通过在trap上设置EXITbash中的特殊伪信号),您确保后台处理将在主脚本时终止退出(通过 Ctrl + C / SIGINT,或通过SIGTERMSIGHUPSIGKILL等任何其他信号退出。 kill 0命令会终止当前进程组中的所有进程。

关于输出 - 在Linux上,后台进程将从shell继承标准输出/错误(如果没有重定向),并继续写入您的TTY /终端。如果这不适用于Windows,我不确定为什么不这样做。

但是,即使你的后台进程以某种方式迷失了你的TTY,你也可以作为一种解决方法附加到日志文件中:

node app1.js >>/path/to/file.log 2>&1 &
node app2.js >>/path/to/file.log 2>&1 &

然后tail -f该日志文件,在此或其他终端中:

tail -f /path/to/file.log