我正在使用&
:為什麼程序不在後台執行?
我知道我可以附加
&
到命令以在後台執行該程序。我正在通過 SSH 連接到一個 Ubuntu 12.04 機器並執行一個 python 程序
$python program.py &
——但是當我關閉終端視窗時,我收到一條消息,說關閉終端將終止正在執行的程序。為什麼是這樣?我正在使用&符號在後台執行該過程。無論我是否使用 SSH,我如何才能讓它執行?
當您關閉終端視窗時,終端仿真器會向它正在執行的程序(即您的 shell)發送一個 SIGHUP。然後,您的 shell 將該 SIGHUP 轉發給它正在執行的所有內容。在您的本地系統上,這是 ssh。然後 ssh 將 SIGHUP 轉發到它正在執行的遠端 shell。因此,您的遠端 shell 然後將 SIGHUP 發送到它的所有程序,即您的後台程序。
有兩種方法可以解決這個問題。
取消後台程序與您的外殼的關聯。
disown
在後台處理您的程序後使用該命令。這將使shell忘記它。
nohup
使用( )為您的命令添加前綴nohup $python program.py &
。這完成了同樣的事情,但使用了一個中間過程。基本上它會忽略 SIGHUP 信號,然後分叉並執行繼承該設置的程序,然後退出。因為它是分叉的,所以正在啟動的程序不是 shell 的子程序,shell 不知道它。除非它為 SIGHUP 安裝信號處理程序,否則它無論如何都會保留忽略操作。使用
logout
(或Ctrl
+d
)而不是關閉終端視窗。當您使用 時logout
,這不是 SIGHUP,因此 shell 不會向其任何子級發送 SIGHUP。此外,您必須確保您的程序不會通過 STDOUT 或 STDERR 寫入終端,因為一旦終端退出,這兩者都將不再存在。如果你不將它們重定向到類似
/dev/null
的東西,程序仍然會執行,但如果它試圖寫入它們,它會得到一個 SIGPIPE,而 SIGPIPE 的預設操作是終止程序)。