全部內容蒐集於網絡,部分作了簡單翻譯shell
在Linux中,當在前臺運行某個做業時,終端被該做業佔據;而在後臺運行做業時,它不會佔據終端。可使用&
命令把做業放到後臺執行。實際上,這樣是將命令放入到一個做業隊列中了:bash
$ ./test.sh & [1] 17208 $ jobs -l [1]+ 17208 Running ./test.sh &
**在後臺運行做業時要小心:**須要用戶交互的命令不要放在後臺執行,由於這樣你的機器就會在那裏傻等。不過,做業在後臺運行同樣會將結果輸出到屏幕上,干擾你的工做。若是放在後臺運行的做業會產生大量的輸出,最好使用下面的方法把它的輸出重定向到某個文件中:網絡
command >out.file 2>&1 &
在上面的例子中,2>&1
表示全部的標準輸出和錯誤輸出都將被重定向到一個叫作out.file
的文件中。當你成功地提交進程之後,就會顯示出一個進程號,能夠用它來監控該進程,或殺死它。翻譯
例:查找名爲httpd.conf
的文件,並把全部標準輸出和錯誤輸出重定向到find.dt
的文件中:code
# find /etc/httpd/ -name "httpd.conf" -print >find.dt 2>&1 & [2] 7832
成功提交該命令以後,系統給出了它的進程號7832。隊列
對於已經在前臺執行的命令,也能夠從新放到後臺執行,首先按ctrl+z
暫停已經運行的進程,而後使用bg
命令將中止的做業放到後臺運行,例如對正在前臺執行的tesh.sh使用ctrl+z掛起它:進程
$ ./test.sh [1]+ Stopped ./test.sh $ bg %1 [1]+ ./test.sh & $ jobs -l [1]+ 22794 Running ./test.sh &
**可是如上方到後臺執行的進程,其父進程仍是當前終端shell的進程,而一旦父進程退出,則會發送hangup信號給全部子進程,子進程收到hangup之後也會退出。**若是咱們要在退出shell的時候繼續運行進程,則須要使用nohup
忽略hangup信號,或者setsid
將將父進程設爲init進程(進程號爲1):it
$ echo $$21734 $ nohup ./test.sh & [1] 29016 $ ps -ef | grep test 515 29710 21734 0 11:47 pts/12 00:00:00 /bin/sh ./test.sh 515 29713 21734 0 11:47 pts/12 00:00:00 grep test $ setsid ./test.sh & [1] 409 $ ps -ef | grep test 515 410 1 0 11:49 ? 00:00:00 /bin/sh ./test.sh 515 413 21734 0 11:49 pts/12 00:00:00 grep test
上面的試驗演示了使用nohup/setsid
加上&
使進程在後臺運行,同時不受當前shell退出的影響。那麼對於已經在後臺運行的進程,該怎麼辦呢?可使用disown命令:test
$ ./test.sh & [1] 2539 $ jobs -l [1]+ 2539 Running ./test.sh & $ disown -h %1 $ ps -ef | grep test 515 410 1 0 11:49 ? 00:00:00 /bin/sh ./test.sh 515 2542 21734 0 11:52 pts/12 00:00:00 grep test
另外還有一種方法,即便將進程在一個subshell中執行,其實這和setsid
殊途同歸。方法很簡單,將命令用括號()
括起來便可:後臺
$ (./test.sh &) $ ps -ef | grep test 515 410 1 0 11:49 ? 00:00:00 /bin/sh ./test.sh 515 12483 21734 0 11:59 pts/12 00:00:00 grep test
**注:**本文試驗環境爲Red Hat Enterprise Linux AS release 4 (Nahant Update 5),shell爲/bin/bash,不一樣的OS和shell可能命令有些不同。例如AIX的ksh,沒有disown
,可是可使用nohup -p PID
來得到disown一樣的效果。
還有一種更增強大的方式是使用screen
,首先建立一個斷開模式的虛擬終端,而後用-r
選項從新鏈接這個虛擬終端,在其中執行的任何命令,都能達到nohup的效果,這在有多個命令須要在後臺連續執行的時候比較方便:
$ screen -dmS screen_test $ screen -list There is a screen on: 27963.screen_test (Detached) 1 Socket in /tmp/uscreens/S-jiangfeng. $ screen -r screen_test
若是你正在運行一個進程,並且你以爲在退出賬戶時該進程還不會結束,那麼可使用nohup
命令。該命令能夠在你退出賬戶以後繼續運行相應的進程。nohup就是不掛起的意思(no hang up)。該命令的通常形式爲:nohup conmmand &
若是使用nohup命令提交做業,那麼在缺省狀況下該做業的全部輸出都被重定向到一個名爲nohup.out
的文件中,除非另外指定了輸出文件:
nohup command > myout.file 2>&1
在上面的例子中,輸出被重定向到myout.file
文件中。