Nohup
nohup 是一個 POSIX 命令,用於忽略 SIGHUP
("signal hang up" 譯:掛斷信號) 。 SIGHUP
信號是終端註銷時所發送至程序的一個信號。
nohup
命令,在默認情況下(非重定向時),會輸出一個名叫 nohup.out 的文件到終端上。
實例
下例中,nohup用於忽略SIGHUP
信號,&
使命令於後台執行,因此終端退出後命令仍舊執行。
$ nohup 命令名 &
值得注意,這種方法防止命令在註銷時被忽略SIGHUP
信號,但,如果該命令對 標準I/O文件(stdin,stdout,或stderr)進行輸入/輸出,那麼該命令仍舊可能被終端掛起。[1] 詳情請看下文的 阻止掛起 。
另外,nohup
命令常常和nice
命令一起執行,以調整命令/程序的優先級。
$ nohup nice 命令 &
相關命令
一些shell(如 Bash)提供一個 shell builtin ,可用於防止發送 SIGHUP 而影響現有的jobs,即使沒使用 nohup
命令。
disown
在Bash,可以通過disown -h job名
忽略 SIGHUP 信號;disown
命令將移除job表中特定的job,這也意味著該job不再接受任何信號。[2][3]
通過 Control+Z 可以將當前進程掛起(放置後台並暫停運行),可通過 fg
命令恢復至前台,也通過bg
將掛起的進程後台運行。
shopt
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 ) 可以執行命令於一個單獨的會話,該會話是分離當前的終端的,這意味著如果當前終端結束後,分離的會話以及其關聯程序仍保持運行。 之後,一個新的終端可以和該會話連接。[9]
- 例如,下例調用了 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. (原始內容存檔於2020-05-18).
- ^ bash(1): GNU Bourne-Again SHell - Linux man page. linux.die.net. [2020-01-10]. (原始內容存檔於2019-12-27).
- ^ 4.3.2 The Shopt Builtin. (原始內容存檔於2019-12-26).
- ^ IBM Knowledge Center (頁面存檔備份,存於網際網路檔案館). 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]. (原始內容存檔於2009-09-13).
- ^ Linux 技巧:让进程在后台运行更可靠的几种方法. www.ibm.com. 2008-05-29 [2020-01-14]. (原始內容存檔於2020-01-14) (中文(中國大陸)).