shell後台進程 fg bg wait等用法

來源:互聯網
上載者:User

標籤:linux shell wait

[[email protected] shelltest]# ./forever2.sh 2014年 10月 15日 星期三 03:36:24 CST2014年 10月 15日 星期三 03:36:26 CST^Z    (--註:ctrl+z)[1]+  Stopped                 ./forever2.sh[[email protected] shelltest]# fg %1./forever2.sh2014年 10月 15日 星期三 03:36:32 CST2014年 10月 15日 星期三 03:36:34 CST^C[[email protected] shelltest]# ps -ef|grep forroot      1807  1773  0 03:04 ?        00:00:00 /usr/libexec/gdm-simple-slave --display-id /org/gnome/DisplayManager/Display1 --force-active-vtroot      1810  1807  0 03:04 tty1     00:00:08 /usr/bin/Xorg :0 -nr -verbose -audit 4 -auth /var/run/gdm/auth-for-gdm-9xEab2/database -nolisten tcp vt1root      1990     1  0 03:06 ?        00:00:00 /bin/dbus-daemon --fork --print-pid 5 --print-address 7 --sessionroot      4309  4188  0 03:36 pts/4    00:00:00 grep for[[email protected] shelltest]# more forever2.sh #!/bin/bashwhile :do date sleep 2doneecho "while end------------------------"echo "hou台運行進程進程ID號:$!"echo "指令碼運行前進程ID號$$"[[email protected] shelltest]#

----

在後台喚醒他

[[email protected] shelltest]# ./forever2.sh 2014年 10月 15日 星期三 03:38:59 CST2014年 10月 15日 星期三 03:39:01 CST^Z[1]+  Stopped                 ./forever2.sh[[email protected] shelltest]# bg %1[1]+ ./forever2.sh &[[email protected] shelltest]# 2014年 10月 15日 星期三 03:39:07 CST2014年 10月 15日 星期三 03:39:09 CST2014年 10月 15日 星期三 03:39:11 CST2014年 10月 15日 星期三 03:39:13 CST2014年 10月 15日 星期三 03:39:15 CST2014年 10月 15日 星期三 03:39:17 CST^C[[email protected] shelltest]# 2014年 10月 15日 星期三 03:39:19 CST2014年 10月 15日 星期三 03:39:21 CST2014年 10月 15日 星期三 03:39:23 CST^C[[email protected] shelltest]# 2014年 10月 15日 星期三 03:39:25 CSTlogout

bg之後他總列印在前台,ctrl+c殺不死他,只好ctrl+d

但是他還是會存在

[[email protected] shelltest]# ps -ef|grep foreverroot      4401     1  0 03:42 ?        00:00:00 /bin/bash ./forever2.shroot      4474  4444  0 03:43 pts/4    00:00:00 grep forever[[email protected] shelltest]#

kill -9 4401殺死他

總結在後台啟動並執行進程ctrl+c殺不死

-----------------

測試指令碼test.sh:

i=1

while:

do

echo$i

sleep1

((i++))

done

一、當在前台運行某個作業時,終端會被該作業佔據,從而需要再開一個終端來進行其他的操作,為了避免這種不方便我們可以將作業放到後台執行,主要有兩種方式


1、&命令


shtest.sh&


該命令將指令碼放到後台執行,但是標準輸出還是會顯示到當前終端,影響使用者操作,所以最好是將輸出重新導向到其他檔案


shtest.sh&>/dev/null


如果需要查看輸出結果,也可以定向到一個固定的檔案中。


2、通過ctrl+z;bg等一系列的命令,將已經在前台啟動並執行作業放到後台執行


如果一個作業已經在前台執行,可以通過ctrl+z將該作業放到後台並掛起。然後通過jobs命令查看在後台執行的作業並找到對應的作業ID,執行bg%n(n為通過jobs查到的作業ID)喚醒該作業繼續執行。


該方式也存在結果會輸出到終端上的情況,同樣可以用重新導向的方法解決


相關命令:


jobs------------查看在後台執行的進程


fg%n----------將後台執行進程n調到前台執行,n表示jobnumber(通過jobs查看的進程編號,而非pid)


ctrl+z----------將在前台執行的進程,放到後台並掛起


bg%n---------將在後台掛起的進程,繼續執行


ctrl+c----------前台進程終止


kill%n---------殺掉後台啟動並執行進程,n表示jobnumber(通過jobs查看的進程編號,而非pid)




二、當使用者登出或者網路中斷時,終端後收到SIGHUP訊號,從而關閉其所有子進程,以上兩種方式會隨著終端的關閉而退出,如果我們需要作業在後台執行並不受終端退出的影響,可以用下面兩種方式


1、nohup命令


nohupshtest.sh&>/dev/null&


nohup命令會忽略SIGHUP訊號,從而終端退出時不會影響到後台作業


2、將作業掛到新的會話下面


(shtest.sh&>/dev/null&)或者將shtest.sh&>/dev/null&放到另一個指令碼中運行都可以實現


將&也放入()後,我們會發現所提交的作業並不在作業列表中,也就是說,是無法通過jobs來查看的,通過ps查看發現新的作業的PPID是1而不是終端的PID,所以終端退出後不會影響我們的作業




三、另外screen命令也可以實現相應的功能,並能解決程式需要人機互動的問題




如果程式是這樣的呢?

[[email protected] shelltest]# more forever.sh #!/bin/bashwhile :do date sleep 2done&echo "while end------------------------"echo "最後一個後台進程的進程id是\$!:$!"echo "指令碼啟動並執行當前進程ID號\$$:$$"[[email protected] shelltest]#

運行:

[[email protected] shelltest]# ./forever.sh while end------------------------最後一個後台進程的進程id是$!:4959指令碼啟動並執行當前進程ID號$$:4958[[email protected] shelltest]# 2014年 10月 15日 星期三 04:07:06 CST2014年 10月 15日 星期三 04:07:08 CST2014年 10月 15日 星期三 04:07:10 CST2014年 10月 15日 星期三 04:07:12 CST2014年 10月 15日 星期三 04:07:14 CST^C[[email protected] shelltest]# 2014年 10月 15日 星期三 04:07:16 CST^C[[email protected] shelltest]# 2014年 10月 15日 星期三 04:07:18 CST2014年 10月 15日 星期三 04:07:20 CST2014年 10月 15日 星期三 04:07:22 CST2014年 10月 15日 星期三 04:07:24 CST2014年 10月 15日 星期三 04:07:26 CST2014年 10月 15日 星期三 04:07:28 CST2014年 10月 15日 星期三 04:07:30 CST2014年 10月 15日 星期三 04:07:32 CST2014年 10月 15日 星期三 04:07:34 CST^C[[email protected] shelltest]#

ctrl+c是殺不死的

[[email protected] ~]# ps -ef|grep forroot      1807  1773  0 03:04 ?        00:00:00 /usr/libexec/gdm-simple-slave --display-id /org/gnome/DisplayManager/Display1 --force-active-vtroot      1810  1807  0 03:04 tty1     00:00:12 /usr/bin/Xorg :0 -nr -verbose -audit 4 -auth /var/run/gdm/auth-for-gdm-9xEab2/database -nolisten tcp vt1root      1990     1  0 03:06 ?        00:00:00 /bin/dbus-daemon --fork --print-pid 5 --print-address 7 --sessionroot      4959     1  0 04:07 pts/2    00:00:00 /bin/bash ./forever.shroot      4979  4145  0 04:07 pts/3    00:00:00 grep for[[email protected] ~]# kill -9  4959[[email protected] ~]#

注意到4959是後台進程id,不是shell指令碼的進程id

參考:


650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/4C/7D/wKioL1Q-ZqSzKhKTAAGZZbiGodI350.jpg" title="spec.png" alt="wKioL1Q-ZqSzKhKTAAGZZbiGodI350.jpg" />


-------

wait命令

wait[進程或者作業]:設定等待的進程或者作業標識-----$ wait %1               #等待作業號為3的作業完成

cat test1 | uniq > newtest1 &

cat test2 | uniq > newtest2 &

wait

diff newtest1 newtest2


為了比較newtest1和newtest2的不同,必須先讓以上的兩個cat命令成功並執行完成並產生newtest1和newtest2,否則diff的執行將錯誤。。。而wait就是保證以上命令執行完成之後才執行diff命令....在以上命令執行完成之前是不會執行diff命令的

sh aa.sh&p0=$!wait $p0sh bb.sh &    sh cc.sh &

一直苦惱一個問題:shell編程中,當一個任務完成時,接下來可以同時有兩個任務可以運行,這兩個任務互不影響。所以想當第一個任務完成後,同時啟動後面的兩個任務,不知到shell中如何同時啟動。


今天解決了:使用後台啟動並執行方式 &。

舉個例子說明比較好。

有一個總執行的all.sh,有三個任務shell,分別是aa.sh, bb.sh,cc.sh。

當運行玩aa.sh後,同時運行bb.sh,cc.sh。


本文出自 “從營運到ETL” 部落格,請務必保留此出處http://fuwenchao.blog.51cto.com/6008712/1564570

shell後台進程 fg bg wait等用法

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.