Linux之進程管理(3)做業管理shell
Linux的做業控制介紹:bash
前臺做業:經過終端啓動,且啓動後一直佔據終端;session
後臺做業:可經過終端啓動,但啓動後轉入後臺運行(釋放終端);app
讓進程做業運行在後臺:ide
一、對運行中的進程:使用Ctrl+zspa
二、還沒有啓動的做業:COMMAND & (在命令行的最後面加一個&符號)命令行
後臺做業與終端關係的處理:blog
後臺做業雖然被送日後臺容許,但其依然與終端相關;退出終端,將關閉後臺做業。若是但願送日後臺後,同時剝離與終端的關係。可使用下面兩種方法:排序
一、# nohup COMMADND & 隊列
注:命令後臺運行並忽略所在進程組接收的HUB信號,可是會生成一個臨時文件
二、# screen; COMMAND
注:使用打開一個臨時會話,這樣即斷電,下次還恢復到screen的當前狀態
查看全部後臺做業命令:
jobs 命令
jobs命令例子:
#將/etc/下的全部shell腳步文件路徑保存到臨時文件中,並放入後臺執行
[root@localhost ~]# find /etc/ -name '*.sh' -exec echo {} > /tmp/tempfile.log \; & [1] 2859
#查看當先後臺做業
[root@localhost ~]# jobs [1]+ Done find /etc/ -name '*.sh' -exec echo {} \; > /tmp/tempfile.log
解析:其中1表示爲做業號,及1號後天做業,而Done表示中止了狀態,表示進程已經結束。
#將當前系統下的全部文件路徑保存到臨時文件中,並放入後臺執行
[root@localhost ~]# find / -exec echo {} > /tmp/tempfile.log \; & [1] 5481
#查看當先後臺做業
[root@localhost ~]# jobs [1]+ Running find / -exec echo {} \; > /tmp/tempfile.log &
解析:這裏顯示 Runing表示正在執行中,由於文件太多因此執行速度不如上面快,執行結束後,若是再也不查看jobs,進程會自動清除,並退出當前做業列表。
做業控制命令:fg bg kill
fg # :將指定後臺做業編號的進程調回前臺運行;
格式:fg # 或者 fg %#,如:fg 3 , fg %3表示將後臺3號做業放到前臺
bg # :讓送日後臺的做業在後臺繼續運行;
格式:bg # 或者 bg %#,如:bg 10 , bg %3表示將3號做業繼續在後臺運行
kill %# :終止指定的做業;
格式:kill %#,如:kill %1 表示殺掉一號做業
jobs、fg、bg等信號命令配合例子:
#講當前系統下的全部文件列表排序後輸入到一個文件保存
[root@mageedu ~]# du -a / | sort -rn > /tmp/du.sorted
解析:由於有不少文件輸出到一個文件,且當前控制檯不會顯示,全部,進程會一直等待輸出重定向介紹,此時,按Ctrl+z鍵,將此命令放入後臺:
[root@mageedu ~]# du -a / | sort -rn > /tmp/du.sorted [1]+ Stopped du -a / | sort -rn > /tmp/du.sorted
解析:這裏如今是暫停狀態,所以,須要再次喚醒。
#查看當前的後臺做業列表
[root@mageedu ~]# jobs [1]+ Stopped du -a / | sort -rn > /tmp/du.sorted
解析:這裏發現了只有一個後臺做業,也就是剛纔執行的重定向命令。可是這裏顯示是Stoped暫停等待狀態,所以此時進程雖然在後臺,可是並無開始運行。
#調動1號做業在後臺繼續運行
[root@mageedu ~]# bg 1 [1]+ du -a / | sort -rn > /tmp/du.sorted &
#再次查看當前jobs做業狀態
[root@mageedu ~]# jobs [1]+ Running du -a / | sort -rn > /tmp/du.sorted &
解析:這時已經表示在後臺運行,此時能夠執行其餘操做,此做業執行完成後會自動退出進程並清除做業記錄。
讓一個做業開始就在後臺進行運行:
#在要執行的命令最後面加入 &符號
[root@mageedu ~]# du -a / | sort -rn > /tmp/du.sorted & [1] 28464
# 查看當前做業列表
[root@mageedu ~]# jobs [1]+ Running du -a / | sort -rn > /tmp/du.sorted &
解析:這裏由於把標準輸出轉向一個文件,因此不會印象當前進程中工做。可是若是執行的命令或者程序自己就會對當前終端有標準輸出,那麼即便在後臺運行,也會把信息輸入到當前控制檯,所以就會影響當前終端會話。如:
#執行ping命令並放入後臺
[root@mageedu ~]# ping 10.1.0.1 &
解析:這時會發現雖然能輸入命令,可是ping的結果的標準輸出仍是會輸出來,下面我經過畫框標記來解釋:
第一個紅色框:這裏按這平時命令jobs;
第一個綠色框:此時下面顯示了在運行狀態,做業號爲2;
第二個紅色框:因而把2行做業調回前臺。而後按Ctrl+c鍵發送INT信號;
第一個紫色框:出現下面信息表示已經總結。
經過以上發如今處理對當前終端有標準終端的進程做業,即便掉入到後臺也不是很好的選擇,由於會影響到當前終端界面的使用的查看。那麼怎麼處理這種問題?
使用nodup命令,忽略接收進程組的INT信號:
[root@mageedu ~]# nohup ping 10.1.0.1 & [1] 30344 [root@mageedu ~]# nohup: appending output to `nohup.out'
解析:這裏出現了一個提示,表示會把輸出的結果放入到nohup.out文件中,這樣就代替了終端來接收標準輸出。
#查看當前做業,發現正在運行
[root@mageedu ~]# jobs [1]+ Running nohup ping 10.1.0.1 &
#使用kill命令終結此做業
[root@mageedu ~]# kill -15 %1
提示:後面的做業號必需要加上%,表示爲jobs列表中的做業號,不然就看成進程的PID了。
使用screen創建額外的會話窗口:
#打開一個screen
[root@mageedu ~]# screen
#備份etc目錄文件
[root@mageedu ~]# find /etc -exec cp -a {} /tmp/etc-bak \;
#此時按Ctrl+a,d來暫時剝離當前screen會話會顯示當前session已經隔離
[detached]
#因而咱們就能夠執行其餘工做了,等待備份完層後,再回到screen會話
[root@mageedu ~]# screen
#而後徹底退出screen會話
[root@mageedu ~]# exit
額外例子(模擬並行多個進程):
#建立3個文件
[root@localhost ~]# ls ./*.sh ./all.sh ./f1.sh ./f2.sh ./f3.sh
#每一個文件都只打印本身的文件基名
[root@localhost ~]# cat f1.sh #!/bin/bash # echo `basename $0`;
#建立all.sh文件,內容以下
[root@localhost ~]# cat all.sh while :;do ./f1.sh& ./f2.sh& ./f3.sh& sleep 2 done
#給全部剛剛建立的文件加執行權限
[root@localhost ~]# chmod +x ./*.sh
#運行all.sh
[root@localhost ~]# ./all.sh f2.sh f3.sh f1.sh f2.sh f1.sh f3.sh f1.sh
解析:咱們發現當3個腳步同時在後臺運行時,運行的隊列是隨機排放的,此時3個文件像是在同時運行,實際上是在後臺開啓了3個子shell各類運行本身。
#修改f{1,2,3}個文件,內容以下:
[root@localhost ~]# cat f1.sh #!/bin/bash # let i=0; while [ $i -lt 10 ];do echo `basename $0`; i=$[i+1]; sleep 2 done
#在命令行中使用()闊住命令開啓子shell進程後臺運行
[root@localhost ~]# (./f1.sh&);(./f2.sh&);(./f3.sh&)f1.sh f3.sh f2.sh f1.sh f3.sh f2.sh f1.sh f3.sh
解析:這裏一樣是打開了3個子shell,而且都在後臺運行,各類互不干擾。
#下面殺死全部剛纔執行腳步進程
[root@localhost ~]# pkill '^f[0-9]\.sh'
#使用{}闊起來
[root@localhost ~]# { ./f1.sh& ./f2.sh& ./f3.sh& } f1.sh f3.sh f2.sh f1.sh f2.sh f3.sh f1.sh f2.sh f3.sh
解析:這裏是使用了bash裏面的代碼塊機制,將多個執行語句使用{},看成一個塊語句執行。