先说说nohub :nohub的意思就是忽略发来的SIGHUB信号。
再说说&: 在命令后面加&代表放入后台执行,当前shell立即返回,不等待子进程的执行结果。
有人会说了,我加上&执行以后,在退出当前shell,子进程依然在执行(变成了孤儿程序 orphan process),为什么需要这个nohub呢。
如果你用的是bash,bash有个选项nohuponexit。这个值默认是 false。意思是说当你交互式shell退出的时候不发送SIGHUB信号给jobs (通过&执行的命令算job)
这个值可以被修改 :shopt -s nohuponexit.(把这个选项修改成on)
也就是说,如果你的bash 选项nohuponexit 为false,那么当shell 退出的时候,不会给他的jobs发送SIGHUB信号,所以子进程依然可以执行,只是成了孤儿程序,被Init程序领养。
如果你的bash 选项nohuponexit 为treu,那么对不起了,即使你的命令是通过&执行的,照样会被毫不留情的关闭。(除非你运行的程序本身就是忽略SIGHUB信号的)
这也就是nohub的作用了。加了nohub命令以后,及时nohuponexit的值为true,当shell退出的时候,子进程依然可以继续运行。
ps:
查看bash的选项命令
root#shopt
启用选项
root#shopt -s 选项
禁用选项
root#shopt -u 选项
ps:直接关闭终端和exit会话是不一样的 ,直接关闭终端jobs会受到hup信号。
参考:http://serverfault.com/questions/115999/if-i-launch-a-background-process-and-then-log-out-will-it-continue-to-run