disown
第一个是第二个的结果吗?换句话说,如果从shell启动的进程被以任何方式从shell的作业控制中删除,那么当shell终止时,shell不会向进程发送SIGHUP吗?
disown -h仍然将进程保存在shell的作业控制下。这是否意味着disown -h使一个进程仍然接收从外壳发送的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在使用终端时的差异,它们的工作效率是否相同?
谢谢。
发布于 2018-11-26 20:05:31
nohup和disown -h并不完全一样。
使用disown,进程将从当前交互式shell中的作业列表中删除。启动后台进程和运行jobs后运行disown不会将该进程显示为shell中的作业。不承认的作业退出时不会从外壳接收到HUP (但请参阅尾注)。
使用disown -h时,作业不会从作业列表中删除,但是如果作业退出,shell将不会向其发送HUP信号(但请参阅最后注意事项)。
nohup实用程序忽略HUP信号并启动给定的实用程序。该实用程序从nohup继承信号掩码,因此也将忽略HUP信号。当shell终止时,该进程仍然是nohup的子进程(并且nohup是init的重子进程)。
区别在于,使用nohup启动的进程将忽略HUP,而不管谁发送信号。不承认的进程只是没有由外壳发送HUP信号,但是仍然可以从例如kill -s HUP 发送信号,并且不会忽略这一点。
请注意,只有在以下情况下才会将HUP发送到shell的作业
huponexit shell选项,或者HUP信号。bash手册中的相关bits (我的重点是):
默认情况下,upon接收
SIGHUP时发出信号表示shell退出。在退出之前,交互式shell将SIGHUP重新发送到所有作业,运行或停止。停止的作业被发送到SIGCONT,以确保它们接收到SIGHUP。为了防止shell向特定作业发送信号,应该从带有disown内置(参见下面的SHELL BUILTIN COMMANDS)的作业表中删除它,或者标记为不使用disown -h接收SIGHUP。Ifhuponexitshell选项已用shopt** 、**bashsends aSIGHUPto设置,当交互登录外壳退出时,所有作业都会被设置。 没有选项的disown [-ar] [-h] [jobspec ... | pid ... ],从活动作业表中删除每个jobspec。如果给出了-h选项,则每个jobspec都从表中删除,但标记为SIGHUPis,如果外壳收到SIGHUP,则不会发送到作业。
相关信息:
发布于 2018-11-26 20:17:07
They是不同的:
nohup.out。nohup由POSIX定义,而不承认则不是。https://unix.stackexchange.com/questions/484276
复制相似问题