Shell

我正在使用&:為什麼程序不在後台執行?

  • April 29, 2021

我知道我可以附加&到命令以在後台執行該程序。

我正在通過 SSH 連接到一個 Ubuntu 12.04 機器並執行一個 python 程序$python program.py &——但是當我關閉終端視窗時,我收到一條消息,說關閉終端將終止正在執行的程序。

為什麼是這樣?我正在使用&符號在後台執行該過程。無論我是否使用 SSH,我如何才能讓它執行?

當您關閉終端視窗時,終端仿真器會向它正在執行的程序(即您的 shell)發送一個 SIGHUP。然後,您的 shell 將該 SIGHUP 轉發給它正在執行的所有內容。在您的本地系統上,這是 ssh。然後 ssh 將 SIGHUP 轉發到它正在執行的遠端 shell。因此,您的遠端 shell 然後將 SIGHUP 發送到它的所有程序,即您的後台程序。

有兩種方法可以解決這個問題。

  1. 取消後台程序與您的外殼的關聯。

  2. disown在後台處理您的程序後使用該命令。這將使shell忘記它。

  3. nohup使用( )為您的命令添加前綴nohup $python program.py &。這完成了同樣的事情,但使用了一個中間過程。基本上它會忽略 SIGHUP 信號,然後分叉並執行繼承該設置的程序,然後退出。因為它是分叉的,所以正在啟動的程序不是 shell 的子程序,shell 不知道它。除非它為 SIGHUP 安裝信號處理程序,否則它無論如何都會保留忽略操作。

  4. 使用logout(或Ctrl+ d)而不是關閉終端視窗。當您使用 時logout,這不是 SIGHUP,因此 shell 不會向其任何子級發送 SIGHUP。

此外,您必須確保您的程序不會通過 STDOUT 或 STDERR 寫入終端,因為一旦終端退出,這兩者都將不再存在。如果你不將它們重定向到類似/dev/null的東西,程序仍然會執行,但如果它試圖寫入它們,它會得到一個 SIGPIPE,而 SIGPIPE 的預設操作是終止程序)。

引用自:https://unix.stackexchange.com/questions/134924