1. 程式人生 > >第十章 Centos7-系統進程管理

第十章 Centos7-系統進程管理

ctrl 取值 包含 條件 互動 完成 cpu占用 一段 txt

第十章 Centos7-系統進程管理

本節所講內容:

10.1 進程概述和ps查看進程工具

10.2 uptime查看系統負載-top動態管理進程

10.3 前後臺進程切換- nice進程優先級-實戰screen後臺執行命令

10.1 進程概述和ps管理進程

10.1.1 什麽是進程?

進程是已啟動的可執行程序的運行實例,進程有以下組成部分:
? 已分配內存的地址空間;
? 安全屬性,包括所有權憑據和特權;
? 程序代碼的一個或多個執行線程;
? 進程狀態

程序: 二進制文件,靜態 /bin/date,/usr/sbin/sshd
進程: 是程序運行的過程, 動態,有生命周期及運行狀態。

下圖所示的是進程的生命周期:

技術分享圖片

描述如下:

父進程復制自己的地址空間(fork [f?:k] 分叉)創建一個新的(子)進程結構。每個新進程分配一個唯一的進程 ID (PID),滿足跟蹤安全性之需。PID 和 父進程 ID (PPID)是子進程環境的元素,任何進程都可以創建子進程,所有進程都是第一個系統進程的後代。

centos5或6PID為1的進程是: init

centos7 PID為1的進程是: systemd

僵屍進程:一個進程使用fork創建子進程,如果子進程退出,而父進程並沒有調用wait或waitpid獲取子進程的狀態信息,那麽子進程的進程描述符仍然保存在系統中。這種進程稱之為僵屍進程。

用自己的話表達

:進程退出了, 進程沒有退出, 那麽這些子進程就沒有父進程來管理了,就變成僵屍進程。

10.1. 2 進程的屬性

進程ID(PID):是唯一的數值,用來區分進程

父進程的ID(PPID)

啟動進程的用戶ID(UID)和所歸屬的組(GID)

進程狀態:狀態分為運行R、休眠S、僵屍Z

進程執行的優先級

進程所連接的終端名

進程資源占用:比如占用資源大小(內存、CPU占用量)

10.1.3 使用ps查看進程工具

1、ps查看進程工具

1:常用的參數:

a: 顯示跟當前終端關聯的所有進程

u: 基於用戶的格式顯示(U: 顯示某用戶ID所有的進程)

x: 顯示所有進程,不以終端機來區分

2:常用的選項組合是 ps -aux

[root@xuegod63 ~]# ps -axu | more

技術分享圖片

技術分享圖片

註: 最後一列[xxxx] 使用方括號括起來的進程是內核態的進程。 沒有括起來的是用戶態進程。

上面的參數輸出每列含意:

USER: 啟動這些進程的用戶

PID: 進程的ID

%CPU 進程占用的CPU百分比;
%MEM 占用內存的百分比;

VSZ:進程占用的虛擬內存大小(單位:KB)
RSS:進程占用的物理內存大小(單位:KB)

STAT:該程序目前的狀態,Linux進程有5種基本狀態:

R :該程序目前正在運作,或者是可被運作;

S :該程序目前正在睡眠當中 (可說是 idle 狀態啦!),但可被某些訊號(signal) 喚醒。

T :該程序目前正在偵測或者是停止了;

Z :該程序應該已經終止,但是其父程序卻無法正常的終止他,造成 zombie (疆屍) 程序的狀態

D 不可中斷狀態.

5個基本狀態後,還可以加一些字母,比如:Ss、R+,如下圖:

技術分享圖片

它們含意如下::

<: 表示進程運行在高優先級上

N: 表示進程運行在低優先級上

L: 表示進程有頁面鎖定在內存中

s: 表示進程是控制進程

l: 表示進程是多線程的

+: 表示當前進程運行在前臺

START:該 process 被觸發啟動的時間;

TIME :該 process 實際使用 CPU 運作的時間。

COMMAND:該程序的實際指令

1: 查看進程狀態

[root@xuegod63 ~]# vim a.txt

在另一個終端執行:

[root@xuegod63 ~]# ps -aux | grep a.txt #查看狀態 S表示睡眠狀態, + 表示前臺

root 4435 0.0 0.2 151752 5292 pts/1 S+ 20:52 0:00 vim a.txt

root 4661 0.0 0.0 112676 996 pts/0 S+ 21:05 0:00 grep --color=auto a.txt

vim a.txt 這個終端上 按下: ctrl+z

[1]+ 已停止 vim a.txt

在另一個終端執行:

[root@xuegod63 ~]# ps -aux | grep a.txt #查看狀態 T表示停止狀態

root 4435 0.0 0.2 151752 5292 pts/1 T 20:52 0:00 vim a.txt

root 4675 0.0 0.0 112676 996 pts/0 S+ 21:05 0:00 grep --color=auto a.txt

註:

ctrl-c 是發送 SIGINT 信號,終止一個進程

ctrl-z 是發送 SIGSTOP信號,掛起一個進程將作業放置到後臺(暫停)

ctrl-d 不是發送信號,而是表示一個特殊的二進制值,表示 EOF代表輸入完成或者註銷

2: D 不可中斷狀態

[root@xuegod63 ~]# tar -zcvf usr-tar.gz /usr/

#然後在另一個終端不斷查看狀態,由S+,R+變為D+

技術分享圖片

2、ps常用的參數: ps -ef

-e 顯示所有進程

-f 顯示完整格式輸出

我們常用的組合: ps -ef

技術分享圖片

包含的信息如下

UID: 啟動這些進程的用戶

PID: 進程的ID

PPID: 父進程的進程號

C: 進程生命周期中的CPU利用率

STIME: 進程啟動時的系統時間

TTY: 表明進程在哪個終端設備上運行。如果顯示 ?表示與終端無關,這種進程一般是內核態進程。另外, tty1-tty6 是本機上面的登入者程序,若為 pts/0 等,則表示運行在虛擬終端上的進程。

TIME: 運行進程一共累計占用的CPU時間

CMD: 啟動的程序名稱

1:測試CPU使用時間。

dd if=/dev/zero of=/a.txt count=10 bs=100M

[root@localhost ~]# ps -axu | grep dd

註:

ps aux 是用BSD的格式來顯示進程

ps -ef 是用標準的格式顯示進程

10.2 uptime查看系統負載-top動態管理進程

10.2.1 uptime查看CPU負載工具

[root@localhost ~]# uptime

13:22:30 up 20days, 2 users, load average: 0.06, 0.60, 0.48

彈出消息含意如下:

13:22:30

當前時間

up 20days

系統運行時間 ,說明此服務器連續運行20天了

2 user

當前登錄用戶數

load average: 0.06, 0.60, 0.48

系統負載,即任務隊列的平均長度。 三個數值分別為 1分鐘、5分鐘、15分鐘前到現在的平均值。

任務隊列的平均長度是什麽?

大廳排除買票:

技術分享圖片

這時隊列是4:

cpu隊列數為3時,如圖:

技術分享圖片

任務隊列的平均長度 懂:1 不懂:2

互動:例1:找出當前系統中,CPU負載過高的服務器?

服務器1: load average: 0.15, 0.08, 0.01 1核

服務器2: load average: 4.15, 6.08, 6.01 1核

服務器3: load average: 10.15, 10.08, 10.01 4核

答案:服務器2

如果服務器的CPU為1核心,則load average中的數字 >=3 負載過高,如果服務器的CPU為4核心,則load average中的數字 >=12 負載過高。

經驗:單核心,1分鐘的系統平均負載不要超過3,就可以,這是個經驗值。

如下圖: 1人只能買1張票,排第四的人可能會急。 所以我們認為超過3就升級CPU

技術分享圖片

10.2.2 top命令

[root@xuegod63 ~]# top #top彈出的每行信息含意如下:

第一行內容和uptime彈出的信息一樣

進程和CPU的信息( 第二、三行)

技術分享圖片

當有多個CPU時,這些內容可能會超過兩行。內容如下:

Tasks: 481 total

進程總數

1 running

正在運行的進程數

480 sleeping

睡眠的進程數

0 stopped

停止的進程數

0 zombie

僵屍進程數

Cpu(s): 0.0% us

系統用戶進程使用CPU百分比。

0.0% sy

內核中的進程占用CPU百分比

0.0% ni

用戶進程空間內改變過優先級的進程占用CPU百分比

98.7% id

空閑CPU百分比

0.0% wa

cpu等待I/0完成的時間總量。

測試:

終端1:執行:top

終端2:dd if=/dev/zero of=/a.txt count=10 bs=100M

終端3:dd if=/dev/zero of=/a.txt count=10 bs=100M

如下:

技術分享圖片

0.0% hi(了解)

硬中斷消耗時間

硬中斷,占的CPU百分比。1. 硬中斷是由硬件產生的,比如,像磁盤,網卡,鍵盤,時鐘等。每個設備或設備集都有它自己的IRQ(中斷請求)。基於IRQ,CPU可以將相應的請求分發到對應的硬件驅動上(註:硬件驅動通常是內核中的一個子程序,而不是一個獨立的進程)。# hi -> Hardware IRQ: The amount of time the CPU has been servicing hardware interrupts.

0.0% si(了解)

軟中斷消耗時間

軟中斷,占的CPU百分比。1. 通常,軟中斷是一些對I/O的請求。這些請求會調用內核中可以調度I/O發生的程序。對於某些設備,I/O請求需要被立即處理,而磁盤I/O請求通常可以排隊並且可以稍後處理。根據I/O模型的不同,進程或許會被掛起直到I/O完成,此時內核調度器就會選擇另一個進程去運行。I/O可以在進程之間產生並且調度過程通常和磁盤I/O的方式是相同。# si -> Software Interrupts.: The amount of time the CPU has been servicingsoftware interrupts.

0.0 ststeal 偷)

st:虛擬機偷取物理的時間。比如:物理機已經運行了KVM,XEN虛擬機。KVM虛擬機占用物理機的cpu時間

內存信息(第四五行)

技術分享圖片

內容如下:

Mem: 2033552k total

物理內存總量

340392k used

使用的物理內存總量

1376636k free

空閑內存總量

316524k buff/cache

用作內核緩存的內存量。

和free -k 一個意思

Swap: 2017948k total

交換區總量

0k used

使用的交換區總量

192772k free

空閑交換區總量

1518148 avail Mem

總的可利用內存是多少

註:如果swap分區,被使用,那麽你的內存不夠用了。

7行進程信息

技術分享圖片

列名

含義

PID

進程id

USER

進程所有者的用戶名

PR

優先級(由內核動態調整),用戶不能

NI

進程優先級。 nice值。負值表示高優先級,正值表示低優先級,用戶可以自己調整

VIRT(virtual memory usage)

虛擬內存,是進程正在使用的所有內存(ps中標為VSZ)

VIRT:virtual memory usage 虛擬內存

1、進程“需要的”虛擬內存大小,包括進程使用的庫、代碼、數據等

2、假如進程申請100m的內存,但實際只使用了10m,那麽它會增長100m,而不是實際的使用量

RES(resident memory usage)

是進程所使用的物理內存。實際實用內存(ps中標為RSS)

RES:resident memory usage 常駐內存

1、進程當前使用的內存大小,但不包括swap out

2、包含其他進程的共享

3、如果申請100m的內存,實際使用10m,它只增長10m,與VIRT相反

4、關於庫占用內存的情況,它只統計加載的庫文件所占內存大小

SHR

共享內存大小,單位kb

SHR:shared memory 共享內存

1、除M了自身進程的共享內存,也包括其他進程的共享內存

2、雖然進程只使用了幾個共享庫的函數,但它包含了整個共享庫的大小

3、計算某個進程所占的物理內存大小公式:RES – SHR

4、swap out後,它將會降下來

S

進程狀態。
D=不可中斷的睡眠狀態
R=運行中或可運行
S=睡眠中
T=已跟蹤/已停止
Z=僵停

%CPU

上次更新到現在的CPU時間占用百分比

%MEM

進程使用的物理內存百分比

TIME+

進程使用的CPU時間總計,單位1/100秒

COMMAND

命令名/命令行

top快捷鍵:

默認3s刷新一次,按s修改刷新時間

按空格 :立即刷新。

q退出

P:按CPU排序

M:按內存排序

T按時間排序

p: 進程IP,查看某個進程狀態

數字鍵1:顯示每個內核的CPU使用率

u/U:指定顯示的用戶

h:幫助

1:運行top,依次演示一下top的快捷鍵,讓大家看一下效果

2:使用TOP動態只查看某個或某些進程的信息

找到進程ID

[root@localhost ~]# ps -axu | grep vim

Warning: bad syntax, perhaps a bogus ‘-‘? See /usr/share/doc/procps-3.2.8/FAQ

root 9667 0.0 0.2 143620 3344 pts/1 S<+ 19:15 0:00 vim a.txt

[root@localhost ~]# top -p 9667

10.2.3 實戰1:找出系統中使用CPU最多的進程

運行top , 找出使用CPU最多的進程 ,按大寫的P,可以按CPU使用率來排序顯示

技術分享圖片

互動:在linux系統中一個進程,最多可以使用100%cpu對嗎?

如下圖,可以看到dirtycow(臟牛漏洞,用於提權) 進程使用196.8%

技術分享圖片

這是你第一次看見: 1

如果你的4核心的cpu,你可以運行400%

10.2.4 lsof命令

lsof命令用於查看你進程打開的文件,打開文件的進程,進程打開的端口(TCP、UDP)

-i<條件>:列出符合條件的進程。(4、6、協議、:端口 @ip )

-p<進程號>:列出指定進程號所打開的文件;

例:

[root@xuegod63 ~]# vim a.txt

[root@xuegod63 ~]# ps -axu | grep a.txt

root 43641 0.8 0.2 151744 5280 pts/3 S+ 18:19 0:00 vim a.txt

root 43652 0.0 0.0 112676 996 pts/1 S+ 18:19 0:00 grep --color=auto a.txt

[root@xuegod63 ~]# lsof -p 43641 #一般用於查看木馬進程,在讀哪些文件

[root@xuegod63 ~]# lsof -i :22 #用於查看端口,或查看黑客開啟的後門端口是哪個進程在使用

10.2.4 pstree工具使用

pstree:(display a tree of processes)以樹狀圖顯示進程,只顯示進程的名字,且相同進程合並顯示。

格式:pstree 或 pstree -p

以樹狀圖顯示進程,還顯示進程PID。

[root@xuegod63 ~]# pstree -p

10.3 前後臺進程切換- nice進程優先級-實戰screen後臺執行命令

10.3.1 Linux後臺進程與前臺進程的區別

前臺進程:是在終端中運行的命令,那麽該終端就為進程的控制終端,一旦這個終端關閉,這個進程也隨著消失

後臺進程: 也叫守護進程(Daemon),是運行在後臺的一種特殊進程,不受終端控制,它不需要終端交互;Linux的大多數服務器就是用守護進程實現的。比如,Web服務器httpd等。

10.3.2 進程的前臺與後臺運行

跟系統任務相關的幾個命令(了解):

&

用在一個命令的最後,可以把這個命令放到後臺執行.

ctrl + z

將一個正在前臺執行的命令放到後臺,並且暫停.

jobs

查看當前有多少在後臺運行的進程.它是一個作業控制命令

fg(foreground process)

將後臺中的命令調至前臺繼續運行, 如果後臺中有多個命令,可以用 fg %jobnumber將選中的命令調出,%jobnumber是通過jobs命令查到的後臺正在執行的命令的序號(不是pid)

bg(background process)

將一個在後臺暫停的命令,變成繼續執行; 如果後臺中有多個命令,可以用bg %jobnumber將選中的命令調出,%jobnumber是通過jobs命令查到的後臺正在執行的命令的序號(不是pid)

實戰恢復被掛起的進程(了解)

例: vim a.txt 按下: ctrl+z

[root@xuegod63 ~]# vim a.txt #打開後,然後執行 ctrl+z

[1]+ 已停止 vim a.txt

[root@xuegod63 ~]# ps -axu | grep vim

root 43710 0.8 0.2 151744 5304 pts/3 T 18:26 0:00 vim a.txt

root 43720 0.0 0.0 112676 984 pts/3 S+ 18:26 0:00 grep --color=auto vim

[root@xuegod63 ~]# jobs #查看當前有多少在後臺運行的進程

[1]+ 已停止 vim a.txt

[root@xuegod63 ~]# fg 1 #將後臺掛起的進程恢復到前臺運行

10.3.3 kill關閉進程

關閉進程3個命令:kill killall pkill

kill關閉進程:kill 進程號 關閉單個進程

killallpkill 命令用於殺死指定名字的進程

通過信號的方式來控制進程的

kill -l =====> 列出所有支持的信號(了解) 用最多的是: 9 信號

技術分享圖片

信號編號 信號名

1)SIGHUP 重新加載配置

2) SIGINT 鍵盤中斷 crtl+c

3) SIGQUIT 退出

9) SIGKILL 強制終止

15) SIGTERM 終止(正常結束),缺省信號

18) SIGCONT 繼續

19) SIGSTOP 停止

20) SIGTSTP 暫停 crtl+z

1: kill和killall終止進程

[root@xuegod63 ~]# kill -9 2342

[root@xuegod63 ~]# killall sshd

[root@xuegod63 ~]# pkill sshd

10.3.4 進程的優先級管理

優先級取值範圍為(-20,19),越小優先級越高, 默認優先級是0

命令1:nice 指定程序的運行優先級

格式:nice n command

命令2:renice 改變程序的運行優先級

格式:renice -n pid

1:指定運行vim的優先級為5

[root@xuegod63 ~]# nice -n 5 vim a.txt

輸入內容,然後ctrl+z 掛起

技術分享圖片

通過ps查看這個文件的PID號

[root@xuegod63 ~]# ps -aux|grep vim

技術分享圖片

通過top命令查看優先級

[root@xuegod63 ~]# top -p 26154

技術分享圖片

改變正在運行的進程的優先級

技術分享圖片

10.3.5 實戰:使用screen後臺實時執行命令備份命令

實戰場景:公司晚上需要備份1T數據,我在xshell上直接執行備份腳本back.sh可以嗎? 或直接運行back.sh & 放到後臺運行可以嗎? 當關了xshell後,back.sh & 還在後臺執行嗎?

答:xshell長時間連接,如果本地網絡偶爾斷開或xshell不小心關閉,都會讓後臺運行的備份命令停止運行的。正確做法使用: srceen

10.3.6 screen概述和安裝

Screen中有會話的概念,,用戶可以在一個screen會話中創建多個screen窗口,在每一個screen窗口中就像操作一個真實的telnet/SSH連接窗口那樣。

安裝screen軟件包

# rpm -ivh /mnt/Packages/screen-4.1.0-0.23.20120314git3c2946.el7_2.x86_64.rpm

或者

[root@xuegod63 ~]# yum -y install screen

10.3.7 screen使用方法

直接在命令行鍵入screen命令回車,如下圖

[root@xuegod63 ~]# screen

Screen將創建一個執行shell的全屏窗口。你可以執行任意shell程序,就像在ssh窗口中那樣

技術分享圖片

例如,我們在做某個大型的操作但是突然之間斷開:

實戰:使用screen後臺實時執行命令備份命令

[root@xuegod63 ~]# screen #進入

[root@xuegod63 ~]# vim a.txt #執行命令, 或執行你自己需要運行的備份命令

此時想離開一段時間,但還想讓這個命令繼續運行

[root@xuegod63 ~]# #在screen當前窗口鍵入快捷鍵Ctrl+a+d

[detached from 44074.pts-3.xuegod63] #分離出來獨立的一個會話

detached [d??t?t?t] 分離,獨立

半個小時之後回來了,找到該screen會話:

[root@tivf06 ~]# screen -ls #查看已經建立的會話ID

There is a screen on:

44074.pts-1.tivf06 (Detached)

1 Socket in /tmp/screens/S-root.

重新連接會話:

[root@xuegod63 ~]# screen -r 44074

root@xuegod63 ~]# exit #不想使用screen 會話了,執行:exit退出。

附:常用screen參數

screen -S test -> 新建一個叫test的會話

screen -ls -> 列出當前所有的會話

screen -r test -> 回到test會話

總結:

10.1 進程概述和ps查看進程工具

10.2 uptime查看系統負載-top動態管理進程

10.3 前後臺進程切換- nice進程優先級-實戰screen後臺執行命令

第十章 Centos7-系統進程管理