Tim*_*Tim 22 bash nohup disown
disown
导致 shell 在 shell 终止时不向其不承认的作业发送 SIGHUP,并且
从 shell 的作业控制中删除被拒绝的作业。
第一个是第二个的结果吗?换句话说,如果从 shell 启动的进程以任何方式从 shell 的作业控制中删除,当 shell 终止时,shell 是否不会向该进程发送 SIGHUP?
disown -h
仍然使进程处于 shell 的作业控制之下。这是否意味着disown -h
使进程仍然接收来自shell发送的SIGHUP,但将进程的SIGHUP动作设置为“忽略”?这听起来类似于nohup
.
$ sleep 123 & disown -h
[1] 26103
$ jobs
[1]+ Running sleep 123 &
$ fg 1
sleep 123
$ ^Z
[1]+ Stopped sleep 125
$ bg 1
[1]+ sleep 123 &
$ exit
$ ps aux | grep sleep
t 26103 0.0 0.0 14584 824 ? S 15:19 0:00 sleep 123
Run Code Online (Sandbox Code Playgroud)
如果我们忽略它们在使用终端方面的差异,那么做disown -h
和nohup
有效地工作是一样的吗?
谢谢。
Kus*_*nda 23
nohup
并且disown -h
不完全相同。
使用disown
,从当前交互式 shell 的作业列表中删除进程。jobs
在启动后台进程并运行后运行disown
不会将该进程显示为 shell 中的作业。一个被取消的作业HUP
在退出时不会从 shell收到 a (但请参阅最后的注释)。
使用disown -h
,作业不会从作业列表中删除,但HUP
如果它退出,shell 不会向它发送信号(但请参阅最后的注释)。
该nohup
实用程序忽略该HUP
信号并启动给定的实用程序。该实用程序继承了信号掩码,nohup
因此也将忽略该HUP
信号。当 shell 终止时,该进程仍然是 的子进程nohup
(并nohup
重新成为 的父进程init
)。
不同之处在于,无论是谁发送信号,进程都以nohup
忽略开始HUP
。六亲不认过程只是不发送一个HUP
信号,由外壳,但是仍然可以从例如发送信号kill -s HUP <pid>
并不会忽略这一点。
请注意,HUP
只有在以下情况下才会发送到 shell 的作业
huponexit
设置了shell 选项,或者HUP
信号。bash
手册中的相关部分(我的重点):
信号
[...]
收到
SIGHUP
.shell 后默认退出。在退出之前,交互式 shell 将重新发送SIGHUP
给所有正在运行或已停止的作业。发送停止的作业SIGCONT
以确保它们收到SIGHUP
. 为防止 shell 将信号发送到特定作业,应使用disown
内置命令(见SHELL BUILTIN COMMANDS
下文)将其从作业表中删除或SIGHUP
使用disown -h
.如果
huponexit
shell 选项已设置为shopt
,则在交互式登录 shell 退出时向所有作业bash
发送 aSIGHUP
。
disown [-ar] [-h] [jobspec ... | pid ... ]
如果没有选项,请
jobspec
从活动作业表中删除每个选项。[...]如果-h
给出选项,每个jobspec
是不会被删除从表中,但被标记,以便SIGHUP
如果shell收到不发送给作业SIGHUP
。[...]
有关的:
他们是不同的:
disown 将从活动作业表中删除该作业。然后继续当前的工作。使用 -h 时,进程不会发送SIGHUP。相反,当它收到 SIGHUP 时,它会与包含它的 shell 一起死亡。
nohup 忽略 HUP。然后,进程关闭时本应传递到终端的任何内容都会转入文件nohup.out
。
nohup 由 POSIX 定义,而 disown 则不是。