在linux中,如果要讓程序在背景運作,一般情況下,我們在指令後面加上&即可,實際上,這樣是将指令放入到一個作業隊列中了:
對于已經在前台執行的指令,也可以重新放到背景執行,首先按ctrl+z暫停已經運作的程序,然後使用bg指令将停止的作業放到背景運作:<code>bg %1</code>,放回前台運作:<code>%1</code>。
但是如上方到背景執行的程序,其父程序還是目前終端shell的程序,而一旦父程序退出,則會發送hangup信号給所有子程序,子程序收到hangup以後也會退出。如果我們要在退出shell的時候繼續運作程序,則需要使用<code>nohup</code>忽略hangup信号,或者<code>setsid</code>将将父程序設為init程序(程序号為1):
nohup 的用途就是讓送出的指令忽略 hangup 信号,标準輸出和标準錯誤預設會被重定向到 nohup.out 檔案中。。一般我們可在結尾加上"&"來将指令同時放入背景運作,也可用" > log.out 2>&1"來更改預設的重定向檔案名。
上面的試驗示範了使用nohup/setsid加上&使程序在背景運作,同時不受目前shell退出的影響。那麼對于已經在背景運作的程序,該怎麼辦呢?可以使用<code>disown</code>指令:
效果與setid相同,但是disown後無法通過<code>jobs</code>指令檢視了。
還有一種更加強大的方式是使用screen,首先建立一個斷開模式的虛拟終端,然後用<code>-r</code>選項重新連接配接這個虛拟終端,在其中執行的任何指令,都能達到nohup的效果,這在有多個指令需要在背景連續執行的時候比較友善。
gnu screen是一款由gnu計劃開發的用于指令行終端切換的自由軟體。使用者可以通過該軟體同時連接配接多個本地或遠端的指令行會話,并在其間自由切換,可以看作是視窗管理器的指令行界面版本。它提供了統一的管理多個會話的界面和相應的功能。
常用screen參數:
正常情況下,當你退出一個視窗中最後一個程式(通常是bash)後,這個視窗就關閉了。另一個關閉視窗的方法是使用c-a k,這個快捷鍵殺死目前的視窗,同時也将殺死這個視窗中正在運作的程序。
在每個screen session 下,所有指令都以 ctrl+a(c-a) 開始。
需要了解的是,一個使用者建立的screen,其他使用者(甚至root)通過<code>screen -ls</code>是看不見的。另外,<code>ctrl+a</code>在bash下是用來回到行開頭,不幸與上面的組合快捷鍵沖突。