如果我启动一个后台进程然后注销,它会继续运行吗?

Mas*_*imo 32 linux bash process background

在与同事长时间讨论后提出这个问题,我真的很想在这里澄清一下。

我启动了一个后台进程,通过将“ &”附加到命令行或通过CTRL-Z使用“ bg”停止并在后台恢复它。然后我退出。

发生什么了?

我们很确定它应该被 SIGHUP 杀死,但这并没有发生;再次登录后,该进程愉快地运行并pstree显示它已被“采用”init.

这是预期的行为吗?

但是,如果是,那么nohup命令的目的是什么?看起来这个过程无论如何都不会被杀死,不管有没有它......


编辑 1

更多细节:

  • 该命令是从 SSH 会话启动的,而不是从物理控制台启动的。
  • 该命令是在没有 nohup和/或的情况下启动的&;然后它被暂停CTRL-Z并在后台恢复bg
  • ssh 会话没有下降。有一个实际的注销 ("exit ”命令)。
  • 这个过程是一个 scp文件复制操作。
  • 再次登录后,pstree显示进程正在运行并且是init.

编辑 2

更清楚地说明问题:是否将进程置于后台(使用&bg)使其 ignore SIGHUP,就像nohup命令一样?


编辑 3

我尝试手动发送一个SIGHUPto scp: 它退出了,所以它绝对不会忽略信号。

然后我再次尝试启动它,将它放在后台并注销:它被“采用”init并继续运行,当我重新登录时我在那里找到了它。

我现在很困惑。看起来SIGHUP在注销时根本没有发送。

Mas*_*imo 26

找到了答案。

对于 BASH,这取决于huponexitshell 选项,可以使用内置shopt命令查看和/或设置该选项。

看起来这个选项默认是关闭的,至少在基于 RedHat 的系统上是这样。

BASH 手册页上的更多信息:

shell 在收到 SIGHUP 后默认退出。在退出之前,交互式 shell 将 SIGHUP 重新发送到所有正在运行或已停止的作业。停止的作业被发送 SIGCONT 以确保它们收到 SIGHUP。为防止 shell 向特定作业发送信号,应使用 disown 内置命令将其从作业表中删除(请参阅下面的 SHELL BUILTIN COMMANDS)或使用 disown -h 标记为不接收 SIGHUP。

如果 huponexit shell 选项已使用 shopt 设置,则 bash 会在交互式登录 shell 退出时向所有作业发送 SIGHUP。

  • 这是一个愚蠢的默认设置,但我的胆量告诉我这是 RH 故障而不是 bash。顺便说一句,使用 zsh,您可以使用 &! 作为拒绝的捷径,进程与 & do get sighup 分叉。 (2认同)

Kim*_*Kim 7

我同意 Warner 的观点,只想补充一点,您可以使用内置的“disown”命令阻止 shell 发送 SIGHUP。bash 手册页包含一个很好的描述。