如果你在linux vps中运行一个命令,它会独占命令行窗口,只有手动中止,才能执行其他命令,这样启动的命令,称为"前台任务"(foreground job)。
变成守护进程的第一步,就是把它改成"后台任务"(background job):只要在命令的尾部加上符号$ node server.js &
&
,启动的进程就会成为"后台任务"。如果要让正在运行的"前台任务"变为"后台任务",可以先按ctrl + z
,然后执行bg
命令.为什么"前台任务"会随着 session 的退出而退出:因为它收到了
SIGHUP
信号。那么,"后台任务"是否也会收到
SIGHUP
信号?这由 Shell 的
huponexit
参数决定的:执行上面的命令,就会看到$ shopt | grep huponexit
huponexit
参数的值。大多数Linux系统,这个参数默认关闭(
off
)。因此,session 退出的时候,不会把SIGHUP
信号发给"后台任务"。所以,一般来说,"后台任务"不会随着 session 一起退出。通过"后台任务"启动"守护进程"并不保险,因为有的系统的
huponexit
参数可能是打开的(on
)。更保险的方法是使用
disown
命令。它可以将指定任务从"后台任务"列表(jobs
命令的返回结果)之中移除。一个"后台任务"只要不在这个列表之中,session 就肯定不会向它发出SIGHUP
信号。执行上面的命令以后,node server.js & $ disown
server.js
进程就被移出了"后台任务"列表。你可以执行jobs
命令验证,输出结果里面,不会有这个进程。disown
的用法如下:还需要对"后台任务"的标准 I/O 进行重定向:# 移出最近一个正在执行的后台任务 $ disown # 移出所有正在执行的后台任务 $ disown -r # 移出所有后台任务 $ disown -a # 不移出后台任务,但是让它们不会收到SIGHUP信号 $ disown -h
上面这样执行,基本上就没有问题了。$ node server.js > /dev/null & $ disown -h
Systemd
除了专用工具以外,Linux系统有自己的守护进程管理工具 Systemd 。它是操作系统的一部分,直接与内核交互,性能出色,功能极其强大。我们完全可以将程序交给 Systemd ,让系统统一管理,成为真正意义上的系统服务。相关帖子:http://briteming.blogspot.com/2016/08/daemonize-daemon.html
(我觉得此文的方法更可靠)