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

我有一个bash脚本:

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

它成功启动了我的两个节点服务器。 然而:

  1. 我没有收到任何输出(从console.log等)在我的terminal窗口
  2. 如果我按(Ctrl + C)取消过程不退出,那么我烦恼地不得不手动执行taskkill / F / PID等。

有没有办法解决?

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

当您的前台进程( 非交互式主脚本)退出时,其subprocess将成为孤立进程,并立即被init进程采用。 要杀死他们,你需要他们的PID。 (在交互式shell中运行后台进程时,会收到SIGHUP ,并在shell退出时退出。)

你的情况的解决scheme是使你的脚本等待其子 ,使用shell内置的wait命令。 wait将确保您的脚本收到SIGINT ,然后您可以处理( trap )并杀死后台作业( kill 0 ):

 #!/bin/bash trap 'kill 0' EXIT node app1.js & node app2.js & wait 

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


关于输出 – 在Linux上,后台进程将inheritanceshell的标准输出/错误(如果没有redirect),并继续写入您的TTY /terminal。 如果这不是Windows上的工作,我不知道为什么不。

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

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

然后在这个或者其他的一些terminal里find这个日志文件:

 tail -f /path/to/file.log