我有一个 bash 脚本:
node web/dist/web/src/app.js & node api/dist/api/src/app.js &
$SHELL
它成功启动了我的两个 Node 服务器。但是:
- 我在终端窗口中没有收到任何输出(来自 console.log 等)
- 如果我通过(Ctrl +C)取消,进程不会退出,所以之后我必须手动执行taskkill/F/PID 等。
还有这方面的事情吗?
最佳答案
无法使用 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
通过在 EXIT
(bash
中的特殊伪信号)上设置 trap
,您将确保每当您的主脚本退出时,后台进程都会终止(通过 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
关于node.js - 使用一个 bash 脚本运行两台 Node 服务器并接收控制台日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47390312/