使用者:九千鴉/Nohup

維基百科,自由的百科全書

nohup 是一個 POSIX 命令,用於忽略 HUP (掛起)的信號。 約定俗成, Hup 信號是在註銷程序 時所發出的終止警告信號。

nohup命令,在默認情況下(非重定向時),會輸出一個名叫 nohup.out 的文件到終端上。

使用[編輯]

下例中,第一個命令用於後台啟動 abcd 程序,之後若是登出,該程序也不會被終止。

$ nohup abcd &
$ exit

值得注意,這種方法防程序在註銷時被發送一個"stop"信號,但此時如果從標準I/O文件(stdin,stdout,或stderr)中輸入/輸出,他們仍然可能被終端掛起。[1] 詳情請看下文的 Overcoming hangingnohup 命令常常和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]

需注意的是,在使用 AIXSolaris 系統的nohup必須添加 p 選項。不同於上述bash內置命令disownnohup -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 &
  • disown 的命令是用於清除job表中的jobs,或者標記jobs,以便在會話結束時不發送SIGHUP信號至標記了的jobs。

參考文獻[編輯]

  1. ^ Re: nohup/disown and logout. Zsh.org. 2005-02-07 [2009-06-10]. (原始內容存檔於2009-05-18). 
  2. ^ Linux / Unix: disown Command Examples. 
  3. ^ Linux 技巧:让进程在后台运行更可靠的几种方法. 
  4. ^ 4.3.2 The Shopt Builtin. 
  5. ^ IBM Knowledge Center 網際網路檔案館存檔,存檔日期2014-10-15.. 01.ibm.com (2015-03-26). Retrieved on 2015-04-13.
  6. ^ SSH Frequently Asked Questions. Snailbook.com. [2009-06-10]. (原始內容存檔於2009-01-22). 
  7. ^ OpenSSH FAQ. Openssh.com. 2005-09-20 [2009-06-10]. (原始內容存檔於2009-07-10). 
  8. ^ Bug 396 – sshd orphans processes when no pty allocated. Bugzilla.mindrot.org. [2009-06-10]. 

外部聯繫[編輯]