后台进程和 SIGHUP

后台进程和 SIGHUP

我的理解是,如果 BASH 终端关闭,与该终端关联的程序将收到 SIGHUP 信号。这通常会终止该程序。

我还知道您可以使用nohup命令和符号&在后台运行程序,并将其与终端分离,以便在终端关闭(注销时)时程序不会终止。

但是,假设一个程序在没有 的情况下正常运行nohup,但随后使用 Cntl-Z 暂停。如果随后使用该bg命令在后台恢复该程序,它会在注销时收到 SIGHUP 信号吗?

或者换句话说:如果我有一个程序已经正在运行,我不想停止它,但我想注销,我可以使用 Cntl-Z 暂停它,然后使用 在后台运行它吗bg?或者当我注销时程序会被终止吗?

答案1

disown如果您使用 Bash,则可以使用该命令。

man bash

如果给出了 -h 选项,则不会从表中删除每个 jobspec,但会进行标记,以便当 shell 收到 SIGHUP 时,不会将 SIGHUP 发送到该作业。

答案2

正如 Dennis 所说,在 bash 中,您可以使用 disown 使作业在关闭 bash 时不会收到 SIGHUP。顺便说一句:如果您setsid不仅使用 来运行它,还可以获得“不发送 SIGHUP”行为nohupsetsid它的优点是不会像 stdout 和 stderr 那样混乱nohup

不过,对您的问题进行一些小的清理:

我的理解是,与 BASH 终端关联的程序

不仅仅是 bash,ksh 和 zsh 在 shell 关闭时也会使用 SIGHUP 终止子进程。这在所有的 shell 中都很常见。我懒得做真正的研究,也不想说“所有”shell 都这么做,但我可以肯定它们都这么做。

BASH 终端

不是 bash 终端,而是 bash shell。终端,也就是终端仿真器,是窗口。Bash shell 在其中运行。

如果该终端关闭,则会收到 SIGHUP 信号。这通常会终止程序。

是的,默认情况下,如果您收到 SIGHUP,您将被终止。任何应用程序都可以选择忽略此信号(然后什么也不会发生),或者可以捕获信号并执行某些操作 - 记录它、清理等等。像 Web 服务器这样的守护进程通常会捕获此信号并将其用作重新读取配置文件的指示器。

相关内容