我有一个bash脚本:
node web/dist/web/src/app.js & node api/dist/api/src/app.js &
$SHELL
它成功启动了我的节点服务器。但是:
到底有没有?
答案 0 :(得分:1)
使用 Ctrl + C 停止后台作业的原因是因为信号(在这种情况下为SIGINT
)仅由前台进程接收。
当您的前台进程(非交互式主脚本)退出时,其子进程变为orphans,init
进程立即采用这些进程。要杀死他们,你需要他们的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
上设置EXIT
(bash
中的特殊伪信号),您确保后台处理将在主脚本时终止退出(通过 Ctrl + C / SIGINT
,或通过SIGTERM
,SIGHUP
,SIGKILL
等任何其他信号退出。 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