目錄:
(一)瞭解進程的概念
(二)如何查看進程&&殺死進程
(三)把程序放置後臺運行
(四)瞭解進程優先級
(五)調整進程優先級shell
(一)瞭解進程的概念
(1.1)在咱們系統後臺中有比較多的概念,第一個「程序」,指的是使用某種語言開發出來的一段代碼,是靜態存放在咱們計算機硬盤上的program,它既不消耗CPU資源,也不消耗內存資源。第二個是「進程」,當一個程序運行的時候,在內存和CPU裏會有體現,例如咱們計算機中運行的QQ、迅雷等應用程序,稱之爲process。第三個是「線程」,線程屬於進程裏的一個單元,一個進程裏能夠包含多個線程,這些線程會共享進程的內存空間。
(1.2)咱們知道系統中的每一個用戶都有本身的ID號,簡稱UID,一樣每一個進程頁都有本身的ID號,process id簡稱PID。進程在運行的過程當中也可能會產生子進程,例如運行的A進程進過一段時間的運行後會產生一個B進程,此時咱們稱A進程爲父進程,稱B進程爲子進程,父進程可能生成一個子進程,也可能會殺死一個子進程,所以父進程和子進程之間是會通訊的,咱們把這種通訊稱之爲「信號」
緩存
(二)如何查看進程&&殺死進程
(2.1)pstree命令
(2.1.1)咱們首先來查看進程之間的父子關係,咱們可使用pstree命令,在vms002主機上它能夠查詢出系統中全部進程的父子關係,其中系統啓動後全部進程的父進程是systemd,它的PID爲1,而rhel6及之前的版本,全部系統的父進程是init。
(2.1.2)pstree以樹狀圖顯示進程,只顯示進程的名字,且相同進程合併顯示,咱們還能以樹狀圖顯示進程,並顯示進程PID
# pstree -p---以樹狀圖顯示進程,並顯示進程PID
# pstree -p | more
(2.2)父進程會按期的向子進程發送信號,那麼系統中的信號有哪些呢?咱們可使用「# kill -l」命令列出系統中全部的信號列表,其中1)SIGHUP表示掛起,就是是重啓,若是咱們想重啓某個服務,可是不想改變其ID號,就可使用1號信號;其中2)SIGINT表示一般狀況下,咱們使用「Ctrl+C」的方式終止進程的方式;而15)SIGTERM表示使用常規的方式終止進程,例如咱們使用kill命令不加任何參數終止某進程的時候,默認就是使用15號信號操做的,可是威力不夠強,對於異常狀態的進程是沒法終止的;此時咱們使用9)SIGKILL信號,表示強制終止某進程,威力也比較強。
# kill -l---列出系統中全部的信號列表
# kill -2 29626---使用「Ctrl+C」的方式終止29626進程
(2.3)殺死進程的方式
(2.3.1)若是咱們開啓了一個進程,例如運行了一個firefox,咱們應該怎樣查看進程的PID號呢?首先咱們可使用pgrep命令,而後直接加上程序名就能夠查詢出進程的PID號了(圖2-3),而後使用kill命令將所查詢的異常進程殺死就能夠了。固然咱們也能夠將兩個步驟合併成一個步驟執行(圖2-4)。
# pgrep firefox---查詢firefox進程的PID號
# kill -9 $(pgrep firefox)---強制殺死firefox進程
# kill -9 pgrep firefox
---強制殺死firefox進程
(2.3.2)固然除了kill命令咱們也可使用killall命令,直接跟上程序名便可。
# killall firefox---殺死firefox進程
(2.3.3)咱們也可使用pkill,其中pkill能夠實現把系統中某用戶踢出的功能。首先咱們使用jerry用戶登陸到vms002主機(圖2-5-1),此時咱們發現系統中是存在jerry用戶登陸的,咱們使用pkill命令將jerry用戶踢出(圖2-5-2),此時咱們使用管理員刪除jerry用戶及其家目錄的時候,即可以順利的操做了(圖2-5-3)。
# pkill -kill -t pts/1
# userdel -r jerry
(2.4)查看進程咱們還可使用pidof命令,不過咱們發現pidof命令後須要跟具體的進程名稱,若是進程名稱查詢時有不一致的地方都是沒法查詢出來,相比pgrep命令,pgrep可使用模糊查詢的方式查詢,所以更加高效。
# pidof firefox---查詢firefox的進程號
(2.5)ps列的選項及意義
(2.5.1)若是咱們但願查詢系統中全部的進程的狀況,可使用ps命令,若是咱們只是使用ps命令的時候是隻能查詢當前終端裏shell進程下本身的幾個進程而已,並不能看到其餘終端裏的進程,也沒法看到系統的後臺進程。因此此時咱們但願查詢到系統中全部進程時,可使用以下兩種方式查詢:
# ps -ef---使用Linux風格的方式顯示系統後臺進程
# ps aux---使用Unix風格的方式顯示系統後臺進程
(2.5.2)接着咱們來了解一下「# pa aux」命令中每一列表明的含義。
# ps aux | head---查詢頭10行的信息
USER:進程的屬主
PID:進程的ID
PPID:父進程
%CPU:進程佔用的CPU百分比
%MEM:佔用內存的百分比
NI:進程的NICE值,數值大,表示較少佔用CPU時間
VSZ:該進程使用的虛擬內存集(KB)
RSS:該進程佔用的固定內存量(KB)(駐留中頁的數量)
TTY:該進程在那個終端上運行(登錄者的終端位置),若與終端無關,則顯示(?)問號,若爲pts/0等,則表示由網絡鏈接主機進程
WCHAN:當前進程是否正在進行,若爲「-」表示正在進行
START:該進程被觸發啓動時間
TIME:該進程實際使用CPU運行的時間
COMMAND:命令的名稱和參數
(2.5.3)咱們來了解一下STAT狀態這一列的相關含義。
D:不可中斷的休眠狀態(一般IO的進程)
R:正在運行中的隊列中可執行的狀態
S:處於休眠狀態
T:中止或被追蹤
W:進入內存交換(從內核2.6開始無效)
X:死掉的進程(基本不多見)
Z:殭屍進程
<:優先級較高的進程
N:優先級較低的進程
L:有些頁被鎖進內存
s:進程的領導者(在它之下有子進程)
l:多進程的(使用CLONE_THREAD,相似NPTL pthreads)
+:位於後臺的進程組
(2.6)ps命令的其它用法
(2.6.1)咱們可使用lscpu查詢當前系統的cpu使用狀況(圖3-6),如今咱們系統中運行了一個應用程序firefox,咱們但願查詢這個程序具體是在當前系統的哪一個CPU上運行的,咱們可使用ps命令作以下的查詢(圖3-7)。
# lscpu
# ps mo pid,comm,psr $(pgrep firefox)---查詢firefox進程及其線程運行在哪一個CPU上,psr表示運行在哪顆CPU
(2.6.2)若是咱們想指定查詢ps命令具體的哪幾列的信息,則可使用以下的方式查詢:
# ps -ex -o pid,%cpu,%mem | head---查詢ps命令具體列的信息
bash
(三)把程序放置後臺運行
(3.1)使用nohup
(3.1.1)當父進程關閉的時候,它所對應的子進程所有跟着關閉。咱們在vms002主機上首先打開一個firefox進程,使用pstree命令發現,firefox是運行在第三個終端bash之上的。
# pstree | grep -C2 firefox
# ps aux | grep -v grep | grep firefox
(3.1.2)當咱們將第三個終端關閉以後,會發如今終端中建立的firefox應用程序也自動關閉了。
# ps aux | grep -v grep | grep firefox
(3.1.3)可是不少時候咱們會經過遠程鏈接的方式執行腳本,若是執行一個腳本須要10個小時,是不是說咱們須要將終端保持鏈接10個小時不關閉?所以爲了解決這個問題,咱們須要將運行的進程放置到後臺運行(圖3-4),此時咱們發現關閉了全部的終端後firefox仍然可以正常的運行。
# nohup firefox &> /dev/null &---咱們建立一個firefox並放置到後臺運行
# ps aux | grep -v grep | grep firefox---查詢當前firefox的運行狀態
# pstree | grep -C2 firefox---使用pstree查詢firefox的運行狀態
注意:grep -v grep表示的是反向過濾,不去搜索grep命令後包含的字段
(3.2)使用jobs
(3.2.1)當咱們在vms002的終端直接運行一個firefox進程後,發現此時終端就沒法再運行其餘的命令了,此時咱們可使用鍵盤「Ctrl+Z」將firefox程序中止並放到後臺。
(3.2.2)若是咱們但願查詢在後臺的程序狀態信息,可使用jobs命令查看。若是咱們想將中止的firefox程序放在後臺激活運行,可使用「# bg 1」命令。
# jobs---查詢進程的狀態
# bg 1---將1號jobs激活並放在後臺運行
(3.2.3)若是咱們但願將後臺運行程序調到前臺來,則可使用「# fg 1」命令,若是咱們想終止運行的程序,則可使用「Ctrl+C」命令。若是咱們在運行程序的時候想直接運行在後臺,則應該使用「# firefox &」這種方式便可,若是咱們想結束進程則可使用kill命令,其中1號jobs使用「%1」表示。
注意:雖然咱們將firefox放置到後臺運行了,可是此時firefox仍然是在當前的終端上運行的,即若是當前終端關閉了那麼此進程也會被關閉,這個要和nohup區分(圖3-12)。
# fg 1---但願將後臺運行程序調到前臺來運行
# firefox &---運行程序的時候想直接運行在後臺
# kill -9 %1---結束進程
# ps aux | grep -v grep | grep firefox
網絡
(四)瞭解進程優先級
(4.1)在咱們系統中全部的任務都是由CPU來完成的,在系統中若是一顆CPU有多顆核,那麼咱們認爲就是有多顆CPU。在計算機中咱們是能夠一次性執行多個任務的,同時一顆CPU也是能夠同時執行多個任務的。對於CPU來講,是分爲時間片執行的,例如如今系統中有多個任務,那麼CPU會對每一個任務分片執行,假設每一個時間片的時長是1ms,由CPU輪詢的在每一個任務之間循環執行,因爲時間片循環的速度很是快,所以通常咱們在系統中操做的時候是感受不到有時間片在輪詢的。有時候咱們會感受系統中某些任務是很是重要的,須要CPU優先執行,此時咱們是能夠在系統中調整進程的優先級的。優先級的組成以下(圖4-1),通常來講,使用chrt命令能夠修改優先係數,不過通常不建議修改(圖4-2),而nice值的範圍是「-20~19」之間,nice值越小優先級越高,nice值越大優先級越低。咱們在圖形化界面中能夠調整進程的優先級的,咱們選擇「應用程序」--「系統工具」--「系統監視器」,而後即可以在圖形化界面中修改進程的優先級了。
(4.2)若是咱們的系統如今有兩個進程,同時有兩顆CPU,若是一個CPU上單獨運行一個進程,那麼對這兩個進程設置進程優先級是沒有意義的,可是咱們但願能出現搶佔資源這種狀況,所以咱們須要把兩個進程放到一顆CPU上去運行。咱們想要實現這樣的效果,通常能夠採用兩種方式,第一種是關閉掉其中的一顆CPU,第二種方式是配置CPU的親和性。ide
(五)調整進程優先級
(5.1)當前系統咱們有兩顆CPU,首先咱們經過關閉其中的一顆CPU的方式來實現進程對資源搶佔的效果,咱們在vms002主機上進入到/sys/devices/system/cpu/cpu1目錄下,發現online的值爲1,表示正在啓用的狀態,咱們能夠將online的值設置爲0,此時表示1號CPU處於關閉的狀態(圖5-2),咱們發現系統中確實此時只有0號CPU在運行(圖5-3)。
(5.2)top命令每一行的含義
(5.2.1)接着咱們在vms002主機上執行兩個cat命令,實現不斷消耗內存的效果(圖5-4)。而後咱們使用top命令查詢當前系統全部進程的狀況,再按鍵盤1能夠顯示全部CPU運行的信息,其中第一行「top - 18:01:29 up 11:52, 6 users, load average: 2.72, 2.11, 1.11」分別表明的是當前的時間是18:01:29,機器一共運行了11:52的時長,當前系統有6 users個用戶登陸,機器在一分鐘、五分鐘、十五分鐘的負載分別是「2.72, 2.11, 1.11」。第二行「Tasks: 475 total, 7 running, 468 sleeping, 0 stopped, 0 zombie」表示的是系統總共有進程475 total,其中7 running在運行,有468 sleeping在睡眠狀態,有0 stopped個是中止的,有0 zombie時殭屍的狀態。因爲咱們將1號CPU關閉了,因此此時2個進程都是在0號CPU上搶佔式運行(圖5-5)。第三行「%Cpu(s): 20.4 us, 79.6 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st」表示的是系統用戶進程使用CPU百分比爲20.4 us,內核中的進程佔用CPU百分比爲79.6 sy,用戶進程空間內改變過優先級的進程佔用CPU百分比爲0.0 ni,空閒CPU百分比爲0.0 id,CPU等待I/O完成的時間總量爲0.0 wa(若是wa佔用較多CPU,緣由是磁盤性能有問題,建議更換磁盤),硬件中斷佔用CPU百分比爲0.0 hi,軟件中斷佔用CPU百分比爲0.0 si,被虛擬內存偷走佔用CPU百分比爲0.0 st。
注意:htop命令也能夠實現top命令的相關顯示,不過須要咱們額外的安裝相關的軟件包
# cat /dev/zero > /dev/null &
# top -d 1---每1秒中更新一次全部進程的顯示
(5.2.2)經驗:
0.0 hi:硬中斷,佔的CPU百分比。硬中斷是由硬件產生的,好比,像磁盤、網卡、鍵盤、時鐘等。每一個設備或設備集都有它本身的IRQ(中斷請求)。基於IRQ,CPU能夠將相應的請求分發到對應的硬件驅動上(注:硬件驅動一般是內核中的一個子程序,而不是一個獨立的進程)hi->Hardware IRQ:The amount of time the CPU has been servicing hardware interrupts
0.0 si:軟中斷,佔的CPU百分比。一般軟中斷是一些對I/O的請求。這些請求會調用內核中能夠調度I/O發生的程序。對於某些設備,I/O請求須要被當即處理,而磁盤I/O請求一般能夠排隊而且能夠稍後處理。根據I/O模型的不一樣,進程或許會被掛起直到I/O完成,此時內核調度器就會選擇另外一個進程去運行。I/O能夠在進程之間產生而且調度過程一般和磁盤I/O的方式是相同的。Si->Software Interrupts:The amount of time the CPUhas been servicing software interrupts。
0.0 st:虛擬機偷取物理CPU的時間。好比:物理機已經運行了KVM,KVM虛擬機佔用物理機的CPU時間。
(5.2.3)第四行中「Mem : 4033636 total」表示物理內存總量,「3265760 free」表示空閒內存總量,「380604 used」表示使用的物理內存總量,「387272 buff/cache」表示用做內核緩存的內存量和free -k是一個意思。第五行中「Swap: 6291448 total」表示交換區總量,「6291448 free」表示空閒交換分區總量,「0 used」表示使用的交換區總量,「3394360 avail Mem」表示總的可利用內存是多少。
(5.2.4)第六行中PID表示進程id,USER表示進程全部者的用戶名,PR表示由內核動態調整的優先級、用戶不能修改,NI表示進程優先級即nice值、負值表示高優先級、正值表示低優先級、用戶能夠本身調整,VIRT表示虛擬內存、是進程正在使用的全部內存,RES表示的是常駐內存集(resident memory usage),SHR表示的是共享內存大小(shared memory)單位kb,S表示進程狀態、其中D(不可中斷的睡眠狀態)、R(運行中或可運行)、S(睡眠中)、T(已跟蹤/已中止)、Z(僵死),%CPU表示上次更新到如今的CPU時間佔用百分比,%MEM表示進程使用的物理內存百分比,TIME+表示使用的CPU時間總計、單位1/100秒,COMMAND表示命令行。
注意:對於SHR:一、除了M自身進程的共享內存,也包括其餘進程的共享內存;二、雖然進程只使用了幾個共享庫的函數,但它包含了整個共享庫的大小;三、計算某個進程所佔的物理內存大小公式爲RES-SHR;四、swap out後,它將會降下來
(5.2.5)對於top快捷鍵:
默認3s刷新一次,按s鍵刷新時間
按空格:當即刷新
q:退出
P:按CPU排序(CPU進行排序)
M:按內存排序
T:按時間排序
數字鍵1:顯示每一個內核的CPU使用率
u/U:指定顯示的用戶
h:幫助
# top -p 9465---使用top命令動態只查看某個或某些進程的信息
(5.3)此時咱們在圖5-5中發現兩個cat進程的NICE值都是0是一致的,而咱們但願將進程11239的進程優先級提升,咱們可使用renice命令。咱們發現11239進程的nice值爲-19,CPU的佔用率爲96.1%,而11232的nice值爲0,CPU的佔用率只有1.9%,所以咱們經過設置nice值而實現了進程搶佔資源的效果,最後咱們使用killall命令終止cat命令的總線。
# renice -n -19 11239---將11239進程的nice值設置爲-19
# killall -7 cat---終止cat命令的總線
(5.4)調整進程優先級
(5.4.1)接着咱們將1號CPU開啓,實現1號CPU和0號CPU都是啓用的狀態(圖5-8),並從新運行兩個cat命令,實現不斷消耗內存的效果(圖5-9),此時咱們發現兩個進程是分別在兩個CPU上運行的(圖5-10)。
# echo 1 > cpu1/online
# cat /dev/zero > /dev/null &
(5.4.2)固然如今咱們想具體的知道每一個進程到底是在哪一個CPU上運行的,咱們可使用ps命令,此時咱們發現13884進程是在0號CPU上運行,13899是在1號CPU上運行的。
# ps mo pid,comm,psr `pgrep cat`
(5.4.3)如今咱們但願在兩顆CPU都是啓用的狀態下,仍然可以指定進程全部的進程都在同一顆CPU上運行,咱們可使用taskset命令進行指定(圖5-12),此時咱們發現兩個進程都已經在同一個CPU上運行了,且各佔0號CPU運行的50%的容量(圖5-13)。
# taskset -c 0 cat /dev/zero > /dev/null &---指定一個cat進程在0號CPU上運行
# ps mo pid,comm,psr pgrep cat
---查詢進程是在哪顆CPU上運行
# top -d 1---使用top命令而且每1秒更新一次
(5.5)咱們在調整優先級的時候,都是修改已經運行了的進程的優先級,那麼咱們是否能夠以某優先級來運行某程序呢?其實這個是能夠的,咱們使用nice指定進程的優先級爲-10,而後開始運行一個cat循環的命令(圖5-14)。咱們使用top命令後發現建立的-10的nice值的進程已經運行了(圖5-15)。
# nice -n -10 taskset -c 1 cat /dev/zero > /dev/null &---咱們使用nice指定進程的優先級爲-10,而後開始運行一個cat循環的命令
# top -d 1
函數
—————— 本文至此結束,感謝閱讀 ——————工具