天天看點

Linux 程序背景運作的幾種方式(screen)

在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 檔案中。。一般我們可在結尾加上"&amp;"來将指令同時放入背景運作,也可用" &gt; log.out 2&gt;&amp;1"來更改預設的重定向檔案名。

上面的試驗示範了使用nohup/setsid加上&amp;使程序在背景運作,同時不受目前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下是用來回到行開頭,不幸與上面的組合快捷鍵沖突。

繼續閱讀