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
如果我们忽略他们在使用终端方面的差异,是否可以有效地工作disown -h
?nohup
谢谢。
nohup
和disown -h
不完全相同的东西。使用
disown
,从当前交互式 shell 中的作业列表中删除一个进程。jobs
在启动后台进程并运行后运行不会disown
将该进程显示为 shell 中的作业。退出的作业在退出时不会收到HUP
来自 shell 的 a(但请参阅末尾的注释)。使用
disown -h
,该作业不会从作业列表中删除,但如果它退出,shell 不会向HUP
它发送信号(但请参阅末尾的注释)。该
nohup
实用程序忽略该HUP
信号并启动给定的实用程序。该实用程序继承了信号掩码,nohup
因此也将忽略该HUP
信号。当 shell 终止时,该进程仍然是nohup
(并nohup
重新成为init
)的子进程。不同之处在于,无论谁发送信号,进程都以
nohup
忽略开始。HUP
被拒绝的进程只是没有由shell发送HUP
信号,但仍可能从 eg 发送信号并且不会忽略这一点。kill -s HUP <pid>
请注意,
HUP
仅在以下情况下才会发送到 shell 的作业huponexit
设置了 shell 选项,或者HUP
信号。手册中的相关内容
bash
(我的重点):有关的:
它们不一样:
disown 从活动作业表中删除作业。然后继续当前的工作。使用 -h不会发送 SIGHUP 进程。相反,当它收到 SIGHUP 时,它会随着包含它的 shell 而死。
nohup 忽略 HUP。然后,任何通过进程关闭传递给终端的东西都会转到文件
nohup.out
中。