node.js - 使用一个 bash 脚本运行两台 Node 服务器并接收控制台日志

标签 node.js bash

我有一个 bash 脚本:

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

$SHELL

它成功启动了我的两个 Node 服务器。但是:

  1. 我在终端窗口中没有收到任何输出(来自 console.log 等)
  2. 如果我通过(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 或通过任何其他信号,如 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

关于node.js - 使用一个 bash 脚本运行两台 Node 服务器并接收控制台日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47390312/

相关文章:

javascript - Jade 模板 : loop in attributes?

javascript - 有没有办法在成功加载内容后延迟发送 Discord 消息?

linux - 用awk解析多行

bash - ECS/Fargate 容器定义命令参数

python - 如何使用 python 通过另一个脚本运行一个文件中的列表

node.js - AngularJS 和 ExpressJS session 管理?

javascript - Express:我可以在一个app.use中使用多个中间件吗?

macos - 在 shell 脚本中执行 Vim 命令

linux - 解析序列文件的 header

javascript - ImmutableJS fromJS() 和 Map() "ownerID"不匹配