Linux之進程管理(3)做業管理


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  表示殺掉一號做業

 

jobsfgbg等信號命令配合例子:

#講當前系統下的全部文件列表排序後輸入到一個文件保存

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

wKioL1fVJNbAu_H0AAAwsaZr7SQ909.png 

解析:這時會發現雖然能輸入命令,可是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裏面的代碼塊機制,將多個執行語句使用{},看成一個塊語句執行。

相關文章
相關標籤/搜索