liangcmwn

          Linux中如何讓進(jìn)程在后臺運行

          在Linux中,如果要讓進(jìn)程在后臺運行,一般情況下,我們在命令后面加上&即可,實際上,這樣是將命令放入到一個作業(yè)隊列中了:

          $ ./test.sh &
          [
          117208

          $ jobs 
          -l
          [
          1]+ 17208 Running                 ./test.sh &

          對于已經(jīng)在前臺執(zhí)行的命令,也可以重新放到后臺執(zhí)行,首先按ctrl+z暫停已經(jīng)運行的進(jìn)程,然后使用bg命令將停止的作業(yè)放到后臺運行:

          $ ./test.sh
          [
          1]+  Stopped                 ./test.sh

          $ bg 
          %1
          [
          1]+ ./test.sh &

          $ jobs 
          -l
          [
          1]+ 22794 Running                 ./test.sh &

          但是如上方到后臺執(zhí)行的進(jìn)程,其父進(jìn)程還是當(dāng)前終端shell的進(jìn)程,而一旦父進(jìn)程退出,則會發(fā)送hangup信號給所有子進(jìn)程,子進(jìn)程收到hangup以后也會退出。如果我們要在退出shell的時候繼續(xù)運行進(jìn)程,則需要使用nohup忽略hangup信號,或者setsid將將父進(jìn)程設(shè)為init進(jìn)程(進(jìn)程號為1)


          $ echo $$
          21734

          $ nohup .
          /test.sh &
          [
          129016

          $ 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 &
          [
          1409

          $ 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加上&使進(jìn)程在后臺運行,同時不受當(dāng)前shell退出的影響。那么對于已經(jīng)在后臺運行的進(jìn)程,該怎么辦呢?可以使用disown命令:

          $ ./test.sh &
          [
          12539

          $ jobs 
          -l
          [
          1]+  2539 Running                 ./test.sh &

          $ disown 
          -%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

          另外還有一種方法,即使將進(jìn)程在一個subshell中執(zhí)行,其實這和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

          注:本文試驗環(huán)境為Red Hat Enterprise Linux AS release 4 (Nahant Update 5),shell為/bin/bash,不同的OS和shell可能命令有些不一樣。例如AIX的ksh,沒有disown,但是可以使用nohup -p PID來獲得disown同樣的效果。

          還有一種更加強(qiáng)大的方式是使用screen,首先創(chuàng)建一個斷開模式的虛擬終端,然后用-r選項重新連接這個虛擬終端,在其中執(zhí)行的任何命令,都能達(dá)到nohup的效果,這在有多個命令需要在后臺連續(xù)執(zhí)行的時候比較方便:

          $ 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

          posted on 2011-07-26 15:27 liangcmwn 閱讀(123) 評論(0)  編輯  收藏 所屬分類: linux


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 随州市| 基隆市| 资兴市| 淅川县| 桂阳县| 华池县| 石狮市| 沿河| 台江县| 萝北县| 嘉义市| 阜新| 乐亭县| 咸阳市| 鄂尔多斯市| 达拉特旗| 平陆县| 沛县| 博湖县| 惠水县| 濮阳市| 静乐县| 炉霍县| 德庆县| 十堰市| 嵊州市| 柏乡县| 阳东县| 油尖旺区| 昭通市| 吉林市| 边坝县| 台北市| 东海县| 南宁市| 封开县| 龙里县| 三河市| 寻乌县| 镇平县| 全南县|