如何让 Node.js 在 Bash 脚本结束后继续运行?
2024-07-14 10:46:25
如何通过 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 进程在脚本结束后继续运行,我们需要将其与当前终端断开连接,并使其成为一个独立的后台进程。
我们可以按照以下步骤实现这个目标:
-
创建 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),方便日后管理该进程。
-
添加执行权限 :
使用以下命令使脚本可执行:
chmod +x startNodeServer.sh
-
运行脚本 :
现在你可以运行脚本了:
./startNodeServer.sh
这将在后台启动你的 Node.js 服务器,并将其与当前终端断开连接。即使你关闭终端或退出脚本,Node.js 服务器也将继续运行。
代码解析
- nohup 命令 :
nohup
是 "no hang up" 的缩写,用于防止进程在终端关闭时收到 SIGHUP 信号而终止。当你使用nohup
运行命令时,它会创建一个新的进程组,并将该命令作为该组的领导进程。即使你关闭终端,该进程组也不会收到 SIGHUP 信号,从而使你的 Node.js 服务器能够继续运行。 - disown 命令 :
disown
命令用于将一个后台进程从当前终端会话中分离。当你使用disown
命令时,该进程将不再与你的终端关联,即使你关闭终端,该进程也不会终止。 - **! 变量** : `!
是一个特殊的 shell 变量,用于存储最后一个后台进程的进程 ID (PID)。你可以使用
echo $!` 命令打印该 PID。
常见问题
-
如何停止在后台运行的 Node.js 进程?
你可以使用
ps aux | grep node
命令找到 Node.js 进程的 PID,然后使用kill <PID>
命令终止该进程。 -
如何查看 Node.js 服务器的输出日志?
脚本运行后,Node.js 服务器的输出日志会被重定向到
output.log
文件中。你可以使用tail -f output.log
命令实时查看日志内容。 -
如何将 Node.js 进程配置为开机自启动?
你可以将脚本添加到 crontab 中,使其在系统启动时自动运行。
-
nohup 命令和 disown 命令有什么区别?
nohup
命令用于防止进程在终端关闭时收到 SIGHUP 信号而终止,而disown
命令用于将一个后台进程从当前终端会话中分离。 -
如何通过 PHP 脚本远程管理 Node.js 服务器?
你可以使用 PHP 的
exec
函数执行startNodeServer.sh
脚本,从而实现对 Node.js 服务器的远程管理。