Linux 進程後臺運行的幾種方式(screen)

Ctrl+z/bg/nohup/setsid/&

在Linux中,若是要讓進程在後臺運行,通常狀況下,咱們在命令後面加上&便可,實際上,這樣是將命令放入到一個做業隊列中了:html

# ./rsync.sh &
# jobs

對於已經在前臺執行的命令,也能夠從新放到後臺執行,首先按ctrl+z暫停已經運行的進程,而後使用bg命令將中止的做業放到後臺運行:bg %1,放回前臺運行:%1linux

可是如上方到後臺執行的進程,其父進程仍是當前終端shell的進程,而一旦父進程退出,則會發送hangup信號給全部子進程,子進程收到hangup之後也會退出。若是咱們要在退出shell的時候繼續運行進程,則須要使用nohup忽略hangup信號,或者setsid將將父進程設爲init進程(進程號爲1):docker

# nohup ./rsync.sh &

# setsid ./rsync.sh &
或
# (./rsync.sh &)        ////在一個subshell中執行
# ps -ef|grep rsync

nohup 的用途就是讓提交的命令忽略 hangup 信號,標準輸出和標準錯誤缺省會被重定向到 nohup.out 文件中。。通常咱們可在結尾加上"&"來將命令同時放入後臺運行,也可用" > log.out 2>&1"來更改缺省的重定向文件名。shell

上面的試驗演示了使用nohup/setsid加上&使進程在後臺運行,同時不受當前shell退出的影響。那麼對於已經在後臺運行的進程,該怎麼辦呢?可使用disown命令:bash

# jobs
# disown -h %1
# ps -ef|grep rsync

效果與setid相同,可是disown後沒法經過jobs命令查看了。session

screen

還有一種更增強大的方式是使用screen,首先建立一個斷開模式的虛擬終端,而後用-r選項從新鏈接這個虛擬終端,在其中執行的任何命令,都能達到nohup的效果,這在有多個命令須要在後臺連續執行的時候比較方便。命令行

GNU Screen是一款由GNU計劃開發的用於命令行終端切換的自由軟件。用戶能夠經過該軟件同時鏈接多個本地或遠程的命令行會話,並在其間自由切換,能夠看做是窗口管理器的命令行界面版本。它提供了統一的管理多個會話的界面和相應的功能。code

# yum install screen -y

經常使用screen參數:htm

# screen -S docker-d    新建一個名叫docker-d的session,並立刻進入
# screen -dmS docker-d  新建一個名叫docker-d的session,但暫不進入,可用於系統啓動腳本里
# screen -ls            列出當前全部session
# screen -r docker-d    恢復到zhouxiao這個session,前提是已是斷開狀態(-d能夠遠程斷開會話)
# screen -x docker-d    鏈接到離線模式的會話(多窗口同步演示)

# screen ./rsync.sh     screen建立一個執行腳本的單窗口會話,能夠attach進程ID
# screen -wipe          檢查目前全部的screen做業,並刪除已經沒法使用的screen做業

正常狀況下,當你退出一個窗口中最後一個程序(一般是bash)後,這個窗口就關閉了。另外一個關閉窗口的方法是使用C-a k,這個快捷鍵殺死當前的窗口,同時也將殺死這個窗口中正在運行的進程。blog

在每一個screen session 下,全部命令都以 ctrl+a(C-a) 開始。

C-a w    顯示全部窗口列表
C-a k    這個快捷鍵殺死當前的窗口,同時也將殺死這個窗口中正在運行的進程。 
C-a d    detach,暫時離開當前session

須要瞭解的是,一個用戶建立的screen,其餘用戶(甚至root)經過screen -ls是看不見的。另外,Ctrl+a在bash下是用來回到行開頭,不幸與上面的組合快捷鍵衝突。

上面只是基本也是最經常使用的用法,更多請參考man screenlinux screen 命令詳解


原文連接地址:http://seanlook.com/2014/02/20/linux-process-running-background-screen/

相關文章
相關標籤/搜索