在与同事长时间讨论后问这个问题,我真的很想在这里澄清一下。
我启动了一个后台进程,或者通过将“ &
”附加到命令行,或者通过CTRL-Z
使用“”停止它并在后台恢复它bg
。然后我退出。
怎么了?
我们很确定它应该被 SIGHUP 杀死,但这并没有发生;再次登录后,该进程正在愉快地运行,并pstree
显示它已被init
.
这是预期的行为吗?
但是,如果是,那么该nohup
命令的目的是什么?看起来这个过程无论如何都不会被杀死,不管有没有它......
编辑 1
更多细节:
- 该命令是从 SSH 会话启动的,而不是从物理控制台启动的。
- 该命令在没有
nohup
和/或的情况下启动&
;然后它被暂停CTRL-Z
并在后台恢复bg
。 - ssh 会话没有中断。有一个实际的注销(“
exit
”命令)。 - 该过程是
scp
文件复制操作。 - 再次登录后,
pstree
显示该进程正在运行并且是init
.
编辑 2
为了更清楚地说明问题:将进程置于后台(使用&
or bg
)使其忽略SIGHUP
,就像nohup
命令一样?
编辑 3
我尝试手动发送一个SIGHUP
to scp
: 它退出了,所以它绝对不会忽略这个信号。
然后我再次尝试启动它,将其置于后台并注销:它被“采用”init
并继续运行,我在重新登录时发现它在那里。
我现在很困惑。SIGHUP
注销后似乎根本没有发送。
找到答案。
对于 BASH,这取决于
huponexit
shell 选项,可以使用内置shopt
命令查看和/或设置。看起来这个选项默认是关闭的,至少在基于 RedHat 的系统上是这样。
有关BASH 手册页的更多信息:
我同意 Warner 的观点,只是想补充一点,您可以使用内置的“disown”命令阻止 shell 发送 SIGHUP。bash 手册页包含一个很好的描述。
您可以使用命令nohup启动命令并将输出重定向到 nohup 输出文件。从 nohup 手册页:
另一种选择是使用屏幕命令。使用 screen 的好处是您可以稍后重新连接到该进程。
当你将一个进程分叉到后台时,它仍然是 shell 中执行它的子进程。
在 shell 下运行的所有子进程在退出时都会发送一个 SIGHUP。性能会根据具体情况略有不同,详细信息请参见 bash 的联机帮助页。其他贝壳可能有类似的描述。
Apache 和其他守护进程通常在 SIGHUP 上重新加载配置。用户空间实用程序经常死掉。与信号相关的应用程序性能对于应用程序来说可能是独一无二的。
过程是什么?之前发布的1中描述的性能是准确的。
某些脚本函数和进程可以捕获信号。while 循环可以像疯了一样跑掉。
看:
SSH 会话丢失 - 命令是否继续执行?
下午 4:22 编辑 1
从 bash 手册页:
初步研究1表明 OpenSSH 可能会忽略 SIGHUP,可能会忽略更多信号。
如果您注销 (Ctrl-D或
exit
),它将继续运行。但是如果你关闭终端窗口,后台进程就会收到SIGHUP
。SIGHUP
如果您失去与服务器的连接,他们还将收到。本地运行的 shell 也是如此(除了你不能失去与本地 shell 的连接)。如果您没有通过类似的工具启动命令
screen
,那么当会话结束时,与该会话关联的所有作业/任务也会如此。