學(xué)習(xí)目標(biāo)
    1、了解進(jìn)程和程序的關(guān)系
    2、了解進(jìn)程的特點(diǎn)
    3、能夠使用top動(dòng)態(tài)查看進(jìn)程信息
    4、能夠使用ps靜態(tài)查看進(jìn)程信息
    5、能夠使用kill命令給進(jìn)程發(fā)送信號(hào)
    在運(yùn)維的日常工作中,監(jiān)視系統(tǒng)的運(yùn)行狀況是每天例行的工作,在 Windows 中我們可以很直觀的使用"任務(wù)管理器"來進(jìn)行進(jìn)程管理,了解系統(tǒng)的運(yùn)行狀態(tài)。
    通常,使用"任務(wù)管理器"主要有 3 個(gè)目的:
    1. 利用"應(yīng)用程序"和"進(jìn)程"標(biāo)簽來査看系統(tǒng)中到底運(yùn)行了哪些程序和進(jìn)程;
    2. 利用"性能"和"用戶"標(biāo)簽來判斷服務(wù)器的健康狀態(tài);
    3. 在"應(yīng)用程序"和"進(jìn)程"標(biāo)簽中強(qiáng)制中止任務(wù)和進(jìn)程;
    在工作中,我們很少會(huì)用到Linux的圖形化界面,更多時(shí)候會(huì)使用命令進(jìn)行進(jìn)程管理,但是進(jìn)程管理的主要目的是一樣的,即:
    查看系統(tǒng)中運(yùn)行的程序和進(jìn)程
    判斷服務(wù)器的健康狀態(tài)
    停止不需要的進(jìn)程
    進(jìn)程是正在執(zhí)行的一個(gè)程序或命令,每個(gè)進(jìn)程都是一個(gè)運(yùn)行的實(shí)體,并占用一定的系統(tǒng)資源。程序是人使用計(jì)算機(jī)語言編寫的可以實(shí)現(xiàn)特定目標(biāo)或解決特定問題的代碼集合。
    簡(jiǎn)單來說,程序是人使用計(jì)算機(jī)語言編寫的,可以實(shí)現(xiàn)一定功能,并且可以執(zhí)行的代碼集合。進(jìn)程是正在執(zhí)行中的程序。
    舉例:谷歌瀏覽器是一個(gè)程序,當(dāng)我們打開谷歌瀏覽器,就會(huì)在系統(tǒng)中看到一個(gè)瀏覽器的進(jìn)程,當(dāng)程序被執(zhí)行時(shí),程序的代碼都會(huì)被加載入內(nèi)存,操作系統(tǒng)給這個(gè)進(jìn)程分配一個(gè) ID,稱為 PID(進(jìn)程 ID)。我們打開多個(gè)谷歌瀏覽器,就有多個(gè)瀏覽器子進(jìn)程,但是這些進(jìn)程使用的程序,都是chrome。推薦了解linux云計(jì)算+運(yùn)維開發(fā)課程。
 
    進(jìn)程查看,通過查看,判斷健康狀態(tài)
    進(jìn)程終止
    進(jìn)程優(yōu)先級(jí)控制
    工作場(chǎng)景:
    小黑入職到一家公司,接到的第一項(xiàng)任務(wù),就是監(jiān)控生產(chǎn)服務(wù)器的性能,提到服務(wù)器性能,我們首先想到的就是CPU,內(nèi)存和磁盤。
    命令:top
    作用:查看服務(wù)器的進(jìn)程占的資源(100%使用)
    語法:# top (動(dòng)態(tài)顯示)
    交換操作快捷鍵:
    M(大寫):表示將結(jié)果按照內(nèi)存(MEM)從高到低進(jìn)行降序排列;
    P(大寫):,表示將結(jié)果按照CPU 使用率從高到低進(jìn)行降序排列;
    1 :當(dāng)服務(wù)器擁有多個(gè)cpu 的時(shí)候可以使用“1”快捷鍵來切換是否展示顯示各個(gè)cpu 的詳細(xì)信息;
    q:退出
    用法一:top
    示例代碼:
    含義:查看CPU使用情況
    ①第一行
    | 內(nèi) 容                         | 說 明                                                        |
    | ----------------------------- | ------------------------------------------------------------ |
    | 10:12:28                      | 系統(tǒng)當(dāng)前時(shí)間                                                 |
    | up 13:05                      | 系統(tǒng)的運(yùn)行時(shí)間.本機(jī)己經(jīng)運(yùn)行 13 小時(shí) 05 分鐘       |
    | 2 users                       | 當(dāng)前登錄了兩個(gè)用戶                                           |
    | load average: 0.00,0.01,0.05 | 系統(tǒng)在之前 1 分鐘、5 分鐘、15 分鐘的平均負(fù)載。如果 CPU 是單核的,則這個(gè)數(shù)值超過 1 就是高負(fù)載:如果 CPU 是四核的,則這個(gè)數(shù)值超過 4 就是高負(fù)載 |
    ②第二行
    | Tasks:   230 total | 系統(tǒng)中的進(jìn)程總數(shù)                                 |
    | ------------------ | ------------------------------------------------ |
    | 1 running          | 正在運(yùn)行的進(jìn)程數(shù)                                 |
    | 229 sleeping       | 睡眠的進(jìn)程數(shù)                                     |
    | 0 stopped          | 正在停止的進(jìn)程數(shù)                                 |
    | 0 zombie           | 僵尸進(jìn)程數(shù)。如果不是   0,則需要手工檢查僵尸進(jìn)程 |
    ③第三行
    | 內(nèi) 容           | 說 明                                                        |
    | --------------- | ------------------------------------------------------------ |
    | Cpu(s): 0.1 %us | 用戶模式占用的   CPU 百分比                                  |
    | 0.1%sy          | 系統(tǒng)模式占用的   CPU 百分比                                  |
    | 0.0%ni          | 改變過優(yōu)先級(jí)的用戶進(jìn)程占用的   CPU 百分比                    |
    | 99.7%id         | 空閑   CPU 占用的 CPU 百分比                                 |
    | 0.1%wa          | 等待輸入/輸出的進(jìn)程占用的   CPU 百分比                       |
    | 0.0%hi          | 硬中斷請(qǐng)求服務(wù)占用的   CPU 百分比                            |
    | 0.1%si          | 軟中斷請(qǐng)求服務(wù)占用的   CPU 百分比                            |
    | 0.0%st          | st(steal   time)意為虛擬時(shí)間百分比,就是當(dāng)有虛擬機(jī)時(shí),虛擬 CPU 等待實(shí)際 CPU 的時(shí)間百分比 |
    問題:如果我的機(jī)器有4核CPU,我想查看每一核心分別的負(fù)載情況怎能辦?
    答:交換快捷鍵 “1”
    ④第四行
    | ------------------ | ------------------------------------------------------------ |
    | Mem: 1863252 total | 物理內(nèi)存的總量,單位為KB                                     |
    | 829960 used        | 己經(jīng)使用的物理內(nèi)存數(shù)量                                       |
    | 68352 free         | 空閑的物理內(nèi)存數(shù)量。我們使用的是虛擬機(jī),共分配了 628MB內(nèi)存,所以只有53MB的空閑內(nèi)存 |
    | 96490 buff/cache   | 作為緩沖的內(nèi)存數(shù)量                                           |
    ⑤第五行
    | ------------------- | ---------------------------- |
    | Swap: 2097148 total | 交換分區(qū)(虛擬內(nèi)存)的總大小 |
    | 3336 used           | 已經(jīng)使用的交換分區(qū)的大小     |
    | 2093812 free        | 空閑交換分區(qū)的大小           |
    | 622420 avail Mem    | 可用內(nèi)存                     |
    我們通過 top 命令的整體信息部分,就可以判斷服務(wù)器的健康狀態(tài)。如果 1 分鐘、5 分鐘、15 分鐘的平均負(fù)載高于CPU核數(shù),說明系統(tǒng)壓力較大。如果物理內(nèi)存的空閑內(nèi)存過小,則也證明系統(tǒng)壓力較大。
    問題:根據(jù)以上信息,目前我們的系統(tǒng)壓力如何?
    問題:如果我們發(fā)現(xiàn)CPU負(fù)載過大,接下來怎么辦?
    2)進(jìn)程信息:
    | PID     | 進(jìn)程的 ID。                                                  |
    | ------- | ------------------------------------------------------------ |
    | USER    | 該進(jìn)程所屬的用戶。                                           |
    | PR      | 優(yōu)先級(jí),數(shù)值越小優(yōu)先級(jí)越高。                                 |
    | NI      | 優(yōu)先級(jí),數(shù)值越小優(yōu)先級(jí)越高。                                 |
    | VIRT    | 該進(jìn)程使用的虛擬內(nèi)存的大小,單位為 KB。                      |
    | RES     | 該進(jìn)程使用的物理內(nèi)存的大小,單位為 KB。                      |
    | SHR     | 共享內(nèi)存大小,單位為 KB。計(jì)算一個(gè)進(jìn)程實(shí)際使用的內(nèi)存 = 常駐內(nèi)存(RES)- 共享內(nèi)存(SHR) |
    | S       | 進(jìn)程狀態(tài)。其中S 表示睡眠,R 表示運(yùn)行                         |
    | %CPU    | 該進(jìn)程占用 CPU 的百分比。                                    |
    | %MEM    | 該進(jìn)程占用內(nèi)存的百分比。                                     |
    | TIME+   | 該進(jìn)程共占用的 CPU 時(shí)間。                                    |
    | COMMAND | 進(jìn)程名                                                       |
    問題:如果我們發(fā)現(xiàn)CPU負(fù)載過大,接下來怎么辦?
    答:查看占用CPU最多的進(jìn)程
    問題:如何查看占用CPU最多的進(jìn)程?
    答:交互操作快捷鍵P,P(大寫):,表示將結(jié)果按照CPU 使用率從高到低進(jìn)行降序排列
    問題:如果我們發(fā)現(xiàn)內(nèi)存可用量很小,接下來怎么辦?
    答:查看占用內(nèi)存最多的進(jìn)程,使用交互快捷鍵M(大寫):表示將結(jié)果按照內(nèi)存(MEM)從高到低進(jìn)行降序排列
    問題:當(dāng)我們查看完系統(tǒng)狀態(tài),需要做什么?
    答:退出,使用q,按鍵盤上的q,就會(huì)回到#提示符的狀態(tài)。
    命令:free
    作用:查看內(nèi)存使用情況
    語法:#free  -m 
    選項(xiàng):-m 表示以mb為單位查看(1g = 1024mb,1mb = 1024kb)
    用法一:free -m
    示例代碼:
    #free -m
    含義:查看內(nèi)存使用情況
    和Centos6相比,buffer和cached被合成一組,加入了一個(gè)available。
 
    關(guān)于此available,即系統(tǒng)可用內(nèi)存,用戶不需要去計(jì)算buffer/cache,即可以看到還有多少內(nèi)存可用,更加簡(jiǎn)單直觀。
    第1行Mem數(shù)據(jù):
    total 內(nèi)存總數(shù): 1819
    used 已經(jīng)使用的內(nèi)存數(shù): 774
    free 空閑的內(nèi)存數(shù): 152
    shared 共享內(nèi)存數(shù): 77
    buff/Cache塊設(shè)備緩存區(qū)內(nèi)存數(shù): 892
    available可用內(nèi)存: 746
    第2行數(shù)據(jù)是Swap交換分區(qū),也就是我們通常所說的虛擬內(nèi)存??梢栽趦?nèi)存不夠使用的情況下當(dāng)臨時(shí)內(nèi)存來使用,交換分區(qū)并不是越大越好,一般話它就等同于實(shí)際內(nèi)存的大小。
    命令:df
    作用:查看磁盤的空間(disk  free)
    語法:# df   [-h]
    選項(xiàng):-h表示可讀性較高的形式展示大小
    這幾列依次是:
    | Filesystem | 磁盤名稱                           |
    | ---------- | ---------------------------------- |
    | Size       | 總大小                             |
    | Used       | 被使用的大小                       |
    | Avail      | 剩余大小                           |
    | Use%       | 使用百分比                         |
    | Mounted on | 掛載路徑(相當(dāng)于Windows 的磁盤符) |
    回到開始的工作場(chǎng)景:
    小黑入職到一家公司,接到的第一項(xiàng)任務(wù),就是監(jiān)控生產(chǎn)服務(wù)器的性能,提到服務(wù)器性能,我們首先想到的就是CPU,內(nèi)存和磁盤。
    問題:小黑具體應(yīng)該如何監(jiān)控CPU,內(nèi)存和磁盤?
    命令:ps(process show進(jìn)程顯示)
    語法:ps [參數(shù)選項(xiàng)]
    作用:主要是查看服務(wù)器的進(jìn)程信息
    選項(xiàng)含義:
    -e:等價(jià)于“-A”,表示列出全部(all)的進(jìn)程
    -f :   表示full,顯示全部的列(顯示全字段)
    | UID   | 該進(jìn)程執(zhí)行的用戶ID                                           |
    | ----- | ------------------------------------------------------------ |
    | PID   | 進(jìn)程ID                                                       |
    | PPID  | 該進(jìn)程的父級(jí)進(jìn)程ID,如果找不到,則該進(jìn)程就被稱之為僵尸進(jìn)程(Parent Process ID) |
    | C     | Cpu的占用率,其形式是百分?jǐn)?shù)                                  |
    | STIME | 進(jìn)程的啟動(dòng)時(shí)間                                               |
    | TTY   | 終端設(shè)備,發(fā)起該進(jìn)程的設(shè)備識(shí)別符號(hào),如果顯示“?”則表示該進(jìn)程并不是由終端設(shè)備發(fā)起 |
    | TIME  | 進(jìn)程實(shí)際使用CPU的時(shí)間                                        |
    | CMD   | 該進(jìn)程的名稱或者對(duì)應(yīng)的路徑                                   |
    工作場(chǎng)景
    小黑用學(xué)到的命令,發(fā)現(xiàn)某個(gè)進(jìn)程占用CPU很高,希望進(jìn)一步查看這個(gè)簡(jiǎn)稱的信息。
    ps -ef 會(huì)列出全部進(jìn)程,但是我們發(fā)現(xiàn)進(jìn)程非常多,我們很難找到自己想要看的進(jìn)程。這里需要使用過濾命令grep,來過濾掉我們不需要的信息。
    用法:ps -ef |grep 想要看到的進(jìn)程名
    示例代碼:
    #ps -ef |grep crond
    含義:查看crond進(jìn)程的詳細(xì)情況
    注意:查詢結(jié)果中,如果只有一條則表示沒查到對(duì)應(yīng)的進(jìn)程(這1 條表示剛才ps 指令的自身)。只有查到的結(jié)果多余1 條,才表示有對(duì)應(yīng)的進(jìn)程。
    補(bǔ)充:針對(duì)上述情況的優(yōu)化:如果沒有對(duì)應(yīng)的進(jìn)程,則什么都不顯示。
    思路:在現(xiàn)有的基礎(chǔ)之上再次使用管道去處理下(-v 選項(xiàng)表示“排除”)。
    擴(kuò)展:ps  auxBSD格式命令,注意沒有橫杠"-"
    Unix有很多分支,目前主流的顯示風(fēng)格分為System V和BSD,我們之前使用的ps -ef屬于system V風(fēng)格,ps aux是BSD風(fēng)格,大家可以理解為兩種風(fēng)格只是顯示不同。
    USER:該 process 屬于哪個(gè)使用者賬號(hào)
    PID :該 process 的ID
    %CPU:該 process 使用掉的 CPU 資源百分比
    %MEM:該 process 所占用的物理內(nèi)存百分比
    VSZ :該 process 使用掉的虛擬內(nèi)存量 (Kbytes)
    RSS :該 process 占用的固定的內(nèi)存量 (Kbytes)
    TTY :該 process 是在那個(gè)終端機(jī)上面運(yùn)作,若與終端機(jī)無關(guān),則顯示 ?,另外, tty1-tty6 是本機(jī)上面的登入者程序,若為 pts/0 等等的,則表示為由網(wǎng)絡(luò)連接進(jìn)主機(jī)的程序。
    STAT:該程序目前的狀態(tài),主要的狀態(tài)有
    R :該程序目前正在運(yùn)作,或者是可被運(yùn)作
    S :該程序目前正在睡眠當(dāng)中 (可說是 idle 狀態(tài)),但可被某些訊號(hào) (signal) 喚醒。
    T :該程序目前正在偵測(cè)或者是停止了
    Z :該程序應(yīng)該已經(jīng)終止,但是其父程序卻無法正常的終止他,造成 zombie (疆尸) 程序的狀態(tài)
    START:該 process 被觸發(fā)啟動(dòng)的時(shí)間
    TIME :該 process 實(shí)際使用 CPU 運(yùn)作的時(shí)間
    COMMAND:該程序的實(shí)際指令
    5、netstat查看進(jìn)程網(wǎng)絡(luò)訪問
 
    命令:netstat
    作用:查看網(wǎng)絡(luò)連接狀態(tài)
    語法:netstat   -tnlp
    選項(xiàng):
    -t:表示只列出tcp 協(xié)議的連接;
 
    -n:表示將地址從字母組合轉(zhuǎn)化成ip 地址,將協(xié)議轉(zhuǎn)化成端口號(hào)來顯示;
    -l :表示過濾出"state(狀態(tài))"列中其值為L(zhǎng)ISTEN(監(jiān)聽)的連接;
    -p:表示顯示發(fā)起連接的進(jìn)程pid 和進(jìn)程名稱;
    Protocol:協(xié)議(tcp、upd、http、https、icmp、ssh…)
    Receive:接收
    Send:發(fā)送
    Local Address:本地地址
    Foreign:遠(yuǎn)程地址
    State:狀態(tài),LISTEN表示偵聽來自遠(yuǎn)方的TCP端口的連接請(qǐng)求
    PID/Program name:進(jìn)程ID和程序名
    命令:kill
    語法:kill [信號(hào)] PID
    作用:kill 命令會(huì)向操作系統(tǒng)內(nèi)核發(fā)送一個(gè)信號(hào)(多是終止信號(hào))和目標(biāo)進(jìn)程的 PID,然后系統(tǒng)內(nèi)核根據(jù)收到的信號(hào)類型,對(duì)指定進(jìn)程進(jìn)行相應(yīng)的操作
    信號(hào)種類:
    | 信號(hào)編號(hào) | 含義                                     |
    | -------- | ---------------------------------------- |
    | 9        | 殺死進(jìn)程,即強(qiáng)制結(jié)束進(jìn)程。               |
    | 15       | 正常結(jié)束進(jìn)程,是 kill   命令的默認(rèn)信號(hào)。 |
    用法一:kill [信號(hào)編號(hào)] PID
    示例代碼:
    #ps -ef |grep crond
    查詢crond進(jìn)程信息,想知道它的PID,以便使用kill終止進(jìn)程
    #kill 6925
    結(jié)束6925的進(jìn)程,這里使用默認(rèn)信號(hào),正常結(jié)束,如果強(qiáng)制結(jié)束,就是kill -9 6925
    #ps -ef |grep crond
    查詢crond進(jìn)程信息,這次查詢是為了確認(rèn)crond進(jìn)程是否被終止了,我們發(fā)現(xiàn)6925進(jìn)程已經(jīng)沒有了
    #systemctl start crond
    使用前面學(xué)過的systemctl命令,重啟crond服務(wù)
    #ps -ef |grep crond
    查詢crond進(jìn)程信息,這次查詢是為了確認(rèn)crond進(jìn)程已經(jīng)重新啟動(dòng)了,我們看到多了一個(gè)32934的進(jìn)程,表明crond已經(jīng)啟動(dòng),并且進(jìn)程ID變化了,這是一個(gè)新的進(jìn)程
    備注:在互聯(lián)網(wǎng)中,經(jīng)??吹絢ill  -9  進(jìn)程PID,強(qiáng)制殺死某個(gè)進(jìn)程,kill -l
    命令:killall
    作用:通過程序的==進(jìn)程名==來殺死==一類==進(jìn)程
    語法:# killall  [信號(hào)] 進(jìn)程名稱
    信號(hào)種類:和kill相同,這里不再重復(fù)
    用法一:killall [信號(hào)編號(hào)] 進(jìn)程名
    示例代碼:
    #ps -ef |grep crond
    查詢crond進(jìn)程信息,想知道它的進(jìn)程名,以便使用killall終止進(jìn)程
    #kill 6925
    結(jié)束6925的進(jìn)程,這里使用默認(rèn)信號(hào),正常結(jié)束,如果強(qiáng)制結(jié)束,就是kill -9 6925
    1、什么是進(jìn)程優(yōu)先級(jí)?
 
    Linux是一個(gè)多用戶、多任務(wù)的操作系統(tǒng),系統(tǒng)中通常運(yùn)行著非常多的進(jìn)程。哪些進(jìn)程先運(yùn)行,哪些進(jìn)程后運(yùn)行,就由進(jìn)程優(yōu)先級(jí)來控制
    PR  優(yōu)先級(jí),數(shù)值越小優(yōu)先級(jí)越高。  
    NI  優(yōu)先級(jí),數(shù)值越小優(yōu)先級(jí)越高。
    問題:這兩個(gè)數(shù)值是在哪里看到的?
    答:
    3、調(diào)整進(jìn)程優(yōu)先級(jí)
 
    ① 調(diào)整==正在運(yùn)行==進(jìn)程的優(yōu)先級(jí)(renice)
    1)使用top按"r"來調(diào)整
    如果要改變某個(gè)進(jìn)程的優(yōu)先級(jí),就要利用 "r" 交互命令。
    改變NICE--->PR
    優(yōu)先級(jí)的范圍:
    -20——19  數(shù)字越低,優(yōu)先級(jí)越高,系統(tǒng)會(huì)按照更多的cpu時(shí)間給該進(jìn)程
    注意:我們能夠修改的只有 Ni 的優(yōu)先級(jí),而不能修改 Pr 的優(yōu)先級(jí)。
    步驟1:運(yùn)行top命令,按r,會(huì)提示輸入希望修改優(yōu)先級(jí)的進(jìn)程的PID,這里輸入6451,表示想修改firewalld進(jìn)程的優(yōu)先級(jí)
    步驟2:輸入6451后回車,提示希望修改的具體數(shù)字,這個(gè)數(shù)字是從-20到19,這里輸入5,數(shù)字越大,優(yōu)先級(jí)別越低,所以,這里是降低了firewalld的優(yōu)先級(jí)
    步驟3:輸入5后,按回車,會(huì)發(fā)現(xiàn)6451進(jìn)程的NI, 從0變成了5,PR從20變成了25
    2)命令行使用renice調(diào)整
    命令:renice
    語法:renice [NI優(yōu)先級(jí)設(shè)置的數(shù)字] 想調(diào)整的進(jìn)程ID
    [root@localhost ~]# renice -5 6451
    含義:將6451進(jìn)程的NI優(yōu)先級(jí)設(shè)置為-5,實(shí)際效果是提高了6451進(jìn)程的優(yōu)先級(jí)
    注意:這里的-5代表設(shè)置成-5,不是所謂加減的關(guān)系,如果當(dāng)前NI的值是10,當(dāng)設(shè)置成-5后,NI的值會(huì)變?yōu)?5.
    ② 程序啟動(dòng)時(shí)指定優(yōu)先級(jí)(nice),只能調(diào)整不在運(yùn)行的程序。
 
    步驟1:將程序停止
    步驟2:?jiǎn)?dòng)并制定優(yōu)先級(jí)
    步驟3:確認(rèn)優(yōu)先級(jí)(查看優(yōu)先級(jí))
    命令:nice
    語法:nice [NI優(yōu)先級(jí)設(shè)置的數(shù)字] 想調(diào)整的進(jìn)程名
    啟動(dòng)進(jìn)程時(shí),通常會(huì)繼承父進(jìn)程的 nice級(jí)別,默認(rèn)為0
    #ps -ef |grep crond
    含義:查看crond的進(jìn)程信息
    目的:找出crond的PID,用于結(jié)束進(jìn)程
    #kill -9 crond的進(jìn)程ID
    含義:結(jié)束crond的進(jìn)程
    目的:nice只能修改不在運(yùn)行的進(jìn)程的優(yōu)先級(jí)
    #ps -ef |grep crond
    含義:查看crond的進(jìn)程信息
    目的:確認(rèn)crond進(jìn)程是不是已經(jīng)停止了
    #nice -n -5 crond
    含義:?jiǎn)?dòng)crond進(jìn)程,將NI設(shè)置成-5
    #ps -ef |grep crond
    含義:查看crond的進(jìn)程信息
    目的:找出crond的PID,用于查看此進(jìn)程的優(yōu)先級(jí)
    #top -p crond的進(jìn)程ID