将此代码段保存为名为snippet.sh
的文件中:
nohup xmessage HI </dev/null &>/dev/null & disown
sleep 3
在同一目录中,执行xterm -e bash snippet.sh
。
3秒后,xterm
窗口将停留,xmessage
应消失。一切都很好。但是,如果从代码段文件中的命令中删除了nohup
怎么办?然后xmessage
与xterm
一起消失。 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
不会停留?
答案 0 :(得分:1)
disown
足以阻止 shell 发送信号,但不会阻止其他任何人。
特别是,shell是终端的控制过程,其进程组中有xmessage
,而退出时是POSIX says:
如果该进程是控制进程,则将SIGHUP信号发送到属于呼叫进程的控制终端的前台进程组中的每个进程。