如何让程序在 Linux 后台运行

Posted on Wed, 25 Dec 2024 13:55:32 +0800 by LiangMingJian


需求

在 Linux 运维时,有时候让一些命令或程序长时间挂载运行。这些命令或任务不能被远程终端关闭结束,也不能被 Ctrl+C 结束,此时就需要将程序放置在后台执行。

通过 nohup& 后台执行

nohup ping 127.0.0.1 > run.log 2>&1 &

在上述命令中,nohup 表示忽略 SIGHUP 信号(挂断信号),允许程序在终端结束后运行;& 表示程序在后台运行,允许程序忽略 Ctrl+C 发送的 SIGINT 信号(中断信号)。

默认情况下,终端关闭时会向关联进程发送 SIGHUP 信号导致进程终止。

同时,Ctrl+C 在按下后向进程发送 SIGINT 信号,中断程序运行。

然后 > run.log 表示将标准输出重定向到 log 文件,2>&1 表示将错误输出(stderr)重定向到标准输出(stdout)中,通过 > run.log 2>&1 的使用,可以让命令的正确输出和错误输出都到一个文件中。

在成功启动程序后,命令行会输出进程 ID,在需要关闭后台进程时,可以通过该进程 ID 进行 kill 关闭。

kill 20481
kill -9 20481
# 参数 -9 用以强制关闭

特别的,如果忘记了该后台执行的进程,可以通过命令 ps aux 显示所有程序。如果还记得名称,则可以使用 grep 进行查找。

ps aux
ps aux | grep ping

扩展阅读:nohup 和 & 的区别

nohup

表示当前执行命令将忽略 SIGHUP 信号(挂断信号),此时即使关闭终端 Shell,也会因为命令对 SIGHUP 信号免疫而不会结束。

只使用 nohup 时,Ctrl+C 可以结束该进程。

&

表示当前执行命令将在后台运行,此时因为程序在后台进行,因此会免疫 SIGINT 信号(中断信号)。当用户使用 Ctrl+C 时,程序照样进行。

只使用 & 时,关闭终端可以结束该进程。

以上

在实际使用时,为让进程不受 Shell 关闭和 Ctrl+C 的影响,命令nohua& 往往配对使用。