返回

如何让 Node.js 在 Bash 脚本结束后继续运行?

Linux

如何通过 Bash 脚本在后台启动 Node 进程并使其在脚本结束后继续运行

在使用 LAMP 技术栈运行 Web 服务器时,你可能需要一个额外的 Node.js 服务器在本地运行,处理部分请求。通常,我们可以通过命令行手动启动或重启这个进程:

cd /var/www/html/connect
node secondaryServer.js &> output.log &
disown

然而,每次都需要手动输入这些命令非常繁琐。为了简化操作,我们可以将这些命令迁移到一个 Bash 脚本中,以便可以通过调用脚本(例如通过网站上的管理控制台远程调用 PHP 脚本来重启 Node.js 服务器。

直接将上述命令放入 Bash 脚本中并不能达到预期效果,因为脚本结束后,Node.js 进程也会随之终止。这是因为子进程默认继承父进程的会话和进程组,当父进程(即你的 Bash 脚本)结束后,子进程也会收到 SIGHUP 信号而终止。

为了使 Node.js 进程在脚本结束后继续运行,我们需要将其与当前终端断开连接,并使其成为一个独立的后台进程。

我们可以按照以下步骤实现这个目标:

  1. 创建 Bash 脚本 :

    创建一个名为 startNodeServer.sh 的新文件,并将以下代码添加到文件中:

    #!/bin/bash
    
    cd /var/www/html/connect
    nohup node secondaryServer.js &> output.log &
    disown
    echo "Node.js server started in background with PID: $!"
    

    让我们来解释一下这段代码的含义:

    • #!/bin/bash: 指定脚本解释器为 Bash。
    • cd /var/www/html/connect: 切换到 Node.js 项目目录。
    • nohup node secondaryServer.js &> output.log &: 使用 nohup 命令启动 Node.js 服务器。
      • nohup: 确保进程忽略 SIGHUP 信号,即使终端关闭也能继续运行。
      • &>: 将标准输出和标准错误重定向到 output.log 文件,方便日后排查问题。
      • &: 将进程放到后台运行。
    • disown: 将进程从当前终端会话中分离,使其成为一个独立的后台进程。
    • echo "Node.js server started in background with PID: $!": 打印启动的 Node.js 进程的进程 ID (PID),方便日后管理该进程。
  2. 添加执行权限 :

    使用以下命令使脚本可执行:

    chmod +x startNodeServer.sh
    
  3. 运行脚本 :

    现在你可以运行脚本了:

    ./startNodeServer.sh
    

    这将在后台启动你的 Node.js 服务器,并将其与当前终端断开连接。即使你关闭终端或退出脚本,Node.js 服务器也将继续运行。

代码解析

  • nohup 命令 : nohup 是 "no hang up" 的缩写,用于防止进程在终端关闭时收到 SIGHUP 信号而终止。当你使用 nohup 运行命令时,它会创建一个新的进程组,并将该命令作为该组的领导进程。即使你关闭终端,该进程组也不会收到 SIGHUP 信号,从而使你的 Node.js 服务器能够继续运行。
  • disown 命令 : disown 命令用于将一个后台进程从当前终端会话中分离。当你使用 disown 命令时,该进程将不再与你的终端关联,即使你关闭终端,该进程也不会终止。
  • **! 变量** : `! 是一个特殊的 shell 变量,用于存储最后一个后台进程的进程 ID (PID)。你可以使用 echo $!` 命令打印该 PID。

常见问题

  1. 如何停止在后台运行的 Node.js 进程?

    你可以使用 ps aux | grep node 命令找到 Node.js 进程的 PID,然后使用 kill <PID> 命令终止该进程。

  2. 如何查看 Node.js 服务器的输出日志?

    脚本运行后,Node.js 服务器的输出日志会被重定向到 output.log 文件中。你可以使用 tail -f output.log 命令实时查看日志内容。

  3. 如何将 Node.js 进程配置为开机自启动?

    你可以将脚本添加到 crontab 中,使其在系统启动时自动运行。

  4. nohup 命令和 disown 命令有什么区别?

    nohup 命令用于防止进程在终端关闭时收到 SIGHUP 信号而终止,而 disown 命令用于将一个后台进程从当前终端会话中分离。

  5. 如何通过 PHP 脚本远程管理 Node.js 服务器?

    你可以使用 PHP 的 exec 函数执行 startNodeServer.sh 脚本,从而实现对 Node.js 服务器的远程管理。