使用者:九千鴉/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].