User:九千鸦/Nohup
nohup 是一个 POSIX 命令,用于忽略 HUP (挂起)的信号。 约定俗成, Hup 信号是在注销程序 时所发出的终止警告信号。
nohup
命令,在默认情况下(非重定向时),会输出一个名叫 nohup.out 的文件到终端上。
使用
[编辑]
下例中,第一个命令用于后台启动 abcd
程序,之后若是登出,该程序也不会被终止。
$ nohup abcd &
$ exit
值得注意,这种方法防程序在注销时被发送一个"stop"信号,但此时如果从标准I/O文件(stdin,stdout,或stderr)中输入/输出,他们仍然可能被终端挂起。[1] 详情请看下文的 Overcoming hanging。
nohup
命令常常和nice
命令一起执行,以降低程序的优先级。
$ nohup nice abcd &
现有的jobs和进程
[编辑]一些shell(如 Bash)提供一个 shell builtin ,可用于防止发送 SIGHUP 而影响现有的jobs,即使没使用 nohup
命令。
disown
[编辑]在Bash,可以通过disown -h job
忽略 SIGHUP 信号;通过disown job
移除job表中特定的job,这也意味着该job不再接受任何信号。[2]
CTRL-z
[编辑]通过CTRL-z
可以将挂起当前进程至后台,并可通过 bg
命令恢复。[3]
相关联
[编辑]shopt huponexit
命令让Bash在登录用的shell退出时,发送SIGHUP信号至所有的jobs。[4]
需注意的是,在使用 AIX 和 Solaris 系统的nohup
必须添加 p
选项。不同于上述bash内置命令disown
,nohup -p
使用的是进程ID。[5]
阻止挂起
[编辑]
注意,即便远程SSH会话注销时,已经nohup
后台job可以避免被中止。另一个常见的问题是,SSH会话常常拒绝注销(或者挂起),因为它不愿意去丢失与后台job(s)进行交互的数据。[6][7] 该问题可通过 重定向 三次I/O流解决:待考证
$ nohup ./myprogram > foo.out 2> foo.err < /dev/null &
同时需要注意,关闭SSH会话不意味着会发送SIGHUP信号至对应程序。 除此以外,还取决于 伪终端 是否被分配。[8]
替代品
[编辑]- 一个 终端复用器(terminal multiplexer ) 可以执行命令于一个单独的会话,该会话是分离当前的终端的,这意味着如果当前终端结束后,分离的会话以及其关联程序仍保持运行。 之后,一个新的终端可以和该会话连接。待考证
- 例如,下例调用了 screen 将会运行"somescript.sh"于后台的一个独立的会话中:
$ screen -A -m -d -S somename ./somescript.sh &
参考文献
[编辑]- ^ Re: nohup/disown and logout. Zsh.org. 2005-02-07 [2009-06-10]. (原始内容存档于2009-05-18).
- ^ Linux / Unix: disown Command Examples.
- ^ Linux 技巧:让进程在后台运行更可靠的几种方法.
- ^ 4.3.2 The Shopt Builtin.
- ^ IBM Knowledge Center 互联网档案馆的存檔,存档日期2014-10-15.. 01.ibm.com (2015-03-26). Retrieved on 2015-04-13.
- ^ SSH Frequently Asked Questions. Snailbook.com. [2009-06-10]. (原始内容存档于2009-01-22).
- ^ OpenSSH FAQ. Openssh.com. 2005-09-20 [2009-06-10]. (原始内容存档于2009-07-10).
- ^ Bug 396 – sshd orphans processes when no pty allocated. Bugzilla.mindrot.org. [2009-06-10].