標籤: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等用法