linux命令後臺運行技巧整理(2)

全部內容蒐集於網絡,部分作了簡單翻譯shell

1、&

在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

2、 nohup

若是你正在運行一個進程,並且你以爲在退出賬戶時該進程還不會結束,那麼可使用nohup命令。該命令能夠在你退出賬戶以後繼續運行相應的進程。nohup就是不掛起的意思(no hang up)。該命令的通常形式爲:nohup conmmand &

若是使用nohup命令提交做業,那麼在缺省狀況下該做業的全部輸出都被重定向到一個名爲nohup.out的文件中,除非另外指定了輸出文件:

nohup command > myout.file 2>&1

在上面的例子中,輸出被重定向到myout.file文件中。

相關文章
相關標籤/搜索