为什么不需要nohup,而disown本身不起作用?

时间:2019-10-14 02:36:55

标签: bash signals nohup

将此代码段保存为名为snippet.sh的文件中:

nohup xmessage HI </dev/null &>/dev/null & disown
sleep 3

在同一目录中,执行xterm -e bash snippet.sh

3秒后,xterm窗口将停留,xmessage应消失。一切都很好。但是,如果从代码段文件中的命令中删除了nohup怎么办?然后xmessagexterm一起消失。 bash文档似乎表明,disown本身应足以阻止发送SIGHUP

       The  shell exits by default upon receipt of a SIGHUP.  Before exiting, an interactive shell resends
       the SIGHUP to all jobs, running or stopped.  Stopped jobs are sent  SIGCONT  to  ensure  that  they
       receive the SIGHUP.  To prevent the shell from sending the signal to a particular job, it should be
       removed from the jobs table with the disown builtin (see SHELL BUILTIN COMMANDS below) or marked to
       not receive SIGHUP using disown -h.

所以,问题是,为什么xmessage窗口如果没有nohup不会停留?

1 个答案:

答案 0 :(得分:1)

disown足以阻止 shell 发送信号,但不会阻止其他任何人。

特别是,shell是终端的控制过程,其进程组中有xmessage,而退出时是POSIX says

  

如果该进程是控制进程,则将SIGHUP信号发送到属于呼叫进程的控制终端的前台进程组中的每个进程。