跳至內容

英文维基 | 中文维基 | 日文维基 | 草榴社区

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]

需注意的是,在使用 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 ) 可以執行命令於一個單獨的會話,該會話是分離當前的終端的,這意味着如果當前終端結束後,分離的會話以及其關聯程序仍保持運行。 之後,一個新的終端可以和該會話連接。[9]
例如,下例調用了 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. (原始內容存檔於2020-05-18). 
  3. ^ bash(1): GNU Bourne-Again SHell - Linux man page. linux.die.net. [2020-01-10]. (原始內容存檔於2019-12-27). 
  4. ^ 4.3.2 The Shopt Builtin. (原始內容存檔於2019-12-26). 
  5. ^ IBM Knowledge Center頁面存檔備份,存於互聯網檔案館). 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]. (原始內容存檔於2009-09-13). 
  9. ^ Linux 技巧:让进程在后台运行更可靠的几种方法. www.ibm.com. 2008-05-29 [2020-01-14]. (原始內容存檔於2020-01-14) (中文(中國大陸)). 

外部連結

[編輯]