­

Centos系統進程管理

  • 2019 年 11 月 12 日
  • 筆記

1、什麼是進程

進程是已啟動的可執行程式的運行實例,進程有以下組成部分:

1.1 已分配記憶體的地址空間;

1.2 安全屬性,包括所有權憑據和特權;

1.3 程式程式碼的一個或多個執行執行緒;

1.4 進程狀態

程式: 二進位文件,靜態 /bin/date, /usr/sbin/httpd,/usr/sbin/sshd, /usr/local/nginx/sbin/nginx 。

進程: 是程式運行的過程, 動態,有生命周期及運行狀態。

2、進程的生命周期

描述如下:

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

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

centos7 PID為1的進程是:systemd

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

用自己的話表達:父進程退出了,子進程沒有退出, 那麼這些子進程就沒有父進程來管理了,就變成殭屍進程。

3、進程的屬性

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

父進程的ID(PPID)

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

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

進程執行的優先順序

進程所連接的終端名

進程資源佔用:比如佔用資源大小(記憶體、CPU佔用量)

4、使用ps查看進程工具

4.1:常用的參數:

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

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

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

4.2常用的選項組合

 [root@docker-01 ~]# ps -aux|more ##是用BSD的格式來顯示進程   USER       PID %CPU %MEM   VSZ   RSS TTY     STAT START   TIME COMMAND   root         1 0.0  0.0 128148 6684?       Ss   11月01   0:09 /usr/lib/syste   md/systemd --switched-root--system--deserialize22   root         2 0.0  0.0      0    0?       S    11月01   0:00 [kthreadd]   root         3 0.0  0.0      0    0?       S    11月01   0:00 [ksoftirqd/0]   root         5 0.0  0.0      0    0?       S<   11月01   0:00 [kworker/0:0H]   root         6 0.0  0.0      0    0?       S    11月01   0:00 [kworker/u8:0]   root         7 0.0  0.0      0    0?       S    11月01   0:00 [migration/0]   root         8 0.0  0.0      0    0?       S    11月01   0:00 [rcu_bh]   root         9 0.0  0.0      0    0?       S    11月01   0:12 [rcu_sched]   root        10 0.0  0.0      0    0?       S<   11月01   0:00 [lru-add-drain     ##包含的資訊如下   USER:     運行進程的用戶   PID:    進程ID   %CPU:   CPU佔用率   %MEM:     記憶體佔用率   VSZ:    佔用虛擬記憶體   RSS:       佔用實際記憶體 駐留記憶體   TTY:    進程運行的終端   STAT:    進程狀態     man ps(/STATE)       R     運行       S     可中斷睡眠 Sleep       D     不可中斷睡眠       T     停止的進程       Z     殭屍進程       X     死掉的進程         Ss     s進程的領導者,父進程       S<    <優先順序較高的進程       SN     N優先順序較低的進程       R+     +表示是前台的進程組       Sl     以執行緒的方式運行   START:     進程的啟動時間   TIME:    進程佔用CPU的總時間   COMMAND:進程文件,進程名     [root@docker-01 ~]# ps -ef|head ##是用標準的格式顯示進程   UID       PID PPID C STIME TTY         TIME CMD   root         1    0 011月01 ?      00:00:09 /usr/lib/systemd/systemd --switched-root--system--deserialize22   root         2    0 011月01 ?      00:00:00 [kthreadd]   root         3    2 011月01 ?      00:00:00 [ksoftirqd/0]   root         5    2 011月01 ?      00:00:00 [kworker/0:0H]   root         6    2 011月01 ?      00:00:00 [kworker/u8:0]   root         7    2 011月01 ?      00:00:00 [migration/0]   root         8    2 011月01 ?      00:00:00 [rcu_bh]   root         9    2 011月01 ?      00:00:12 [rcu_sched]   root        10    2 011月01 ?      00:00:00 [lru-add-drain]   ##包含的資訊如下   UID: 啟動這些進程的用戶   PID: 進程的ID   PPID: 父進程的進程號   C: 進程生命周期中的CPU利用率   STIME: 進程啟動時的系統時間   TTY: 表明進程在哪個終端設備上運行。如果顯示 ?表示與終端無關,這種進程一般是內核態進程。另外, tty1-tty6 是本機上面的登入者程式,若為 pts/0 等,則表示運行在虛擬終端上的進程。   TIME: 運行進程一共累計佔用的CPU時間   CMD: 啟動的程式名稱

4.3對進程的指定列進行排序

 [root@docker-01 ~]# ps aux --sort %cpu |less ##升序排序   [root@docker-01 ~]# ps aux --sort -%cpu |less ##降序排序   [root@docker-01 ~]# ps aux --sort rss |less   [root@docker-01 ~]# ps aux --sort -rss |less

4.4不可中斷狀態

 [root@docker-01 ~]# tar -zcvf usr-tar.gz /usr/   ###然後在另一個終端不斷查看狀態,由S+,R+變為D+   [root@docker-01 ~]# ps -axu|grep tar   root     25426 3.8  0.0 123688 1552pts/0   R+  10:31   0:01 tar -zcvfusr-tar.gz /usr/   root     25447 0.0  0.0 112724  984pts/1   S+  10:31   0:00 grep--color=auto tar   root     25426 3.8  0.0 123688 1552pts/0   D+  10:31   0:01 tar -zcvfusr-tar.gz /usr/   root     25447 0.0  0.0 112724  984pts/1   S+  10:31   0:00 grep--color=auto tar

5、找出系統中使用CPU最多的進程

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

 [root@docker-01 ~]# top   top-10:48:16 up 1day, 18:41,  2users, load average: 0.00, 0.04, 0.08   Tasks: 111total,   2running, 109sleeping,   0stopped,   0zombie   %Cpu(s):  0.1 us,  0.1 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0   KiB Mem : 16266520total, 11269388free,  2162204used,  2834928buff/cache   KiB Swap:  2097148total,  2097148free,        0used. 13687952avail Mem     PID USER     PR NI   VIRT   RES   SHR S %CPU %MEM     TIME+COMMAND   17427kibana    20  02515164  1.3g  10324S   0.7  8.3   9:05.29 node   17255elastic+ 20  04713976308280 15708S   0.3  1.9  11:09.30 java  

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

 [root@localhost ~]# top   top-10:51:24 up 61days, 23:00,  2users, load average: 46.56, 48.38, 34.85   Tasks: 267total,   1running, 266sleeping,   0stopped,   0zombie   Cpu(s): 96.9%us,  1.6%sy,  0.0%ni,  0.3%id,  0.0%wa,  0.5%hi,  0.5%si,  0.2%st   Mem: 71545156k total, 71079896k used,   465260k free,   58836k buffers   Swap: 2097148k total,       0k used, 2097148k free, 18012268k cached     PID USER     PR NI VIRT RES SHR S %CPU %MEM   TIME+COMMAND   13073smgadmin  20  05451m 1.4g 21m S 130.5  2.0 184:57.92 java   30753smgadmin  20  04801m 1.3g 21m S 92.7  2.0  20:14.24 java   ##可以看到java(臟牛漏洞,用於提權) 進程使用130.5%

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

6、Isof查看進程打開的文件,打開文件的進程,進程打開的埠(TCP、UDP)

 [root@docker-01 ~]# yum install lsof   [root@docker-01 ~]# vim a.txt   [root@docker-01 ~]# ps -axu | grep a.txt   root     25526 0.0  0.0 151532 5200pts/0   S+  10:55   0:00 vima.txt   root     25560 0.0  0.0 112724 1004pts/1   S+  10:57   0:00 grep--color=auto a.txt   [root@docker-01 ~]# lsof -p 25526 ##一般用於查看木馬進程,在讀哪些文件   [root@docker-01 ~]# lsof -i :22 ##用於查看埠,或查看黑客開啟的後門埠是哪個進程在使用

7、進程優先順序nice

7.1進程調度及多任務

每個CPU(或CPU核心)在一個時間點上只能處理一個進程,通過時間片技術,Linux實際能夠運行的進程(和執行緒數)可以超出實際可用的CPU及核心數量。Linux內核進程調度程式將多個進程在CPU核心上快速切換,從而給用戶多個進程在同時運行的印象。

7.2相對優先順序 nice

由於不是每個進程都與其他進程同樣重要,可告知進程調度程式為不同的進程使用不同的調度策略。常規系統上運行的大多數進程所使用的調度策略為 SCHED_OTHER (也稱為SCHED_NORMAL),但還有其它一些調度策略用於不同的目的。

SCHED_OTHER 調度策略運行的進程的相對優先順序稱為進程的 nice 值,可以有40種不同級別的nice值。

nice 值越高:表示優先順序越低,例如+19,該進程容易將CPU 使用量讓給其他進程。nice 值越低:表示優先順序越高,例如-20,該進程更不傾向於讓出CPU。

7.3nice啟動級別的設置

 ##啟動進程時,通常會繼承父進程的 nice級別,默認為0。   [root@docker-01 ~]# sleep 6000 &   [1] 25601   [root@docker-01 ~]# ps axo command,pid,nice |grep sleep   sleep6000                 25601  0   grep--color=auto sleep    25603  0   ##指定啟動級別為5   [root@docker-01 ~]# nice -n 5 sleep 6000 &   [2] 25605   [1]   已殺死               sleep6000   [root@docker-01 ~]# ps axo command,pid,nice |grep sleep   sleep6000                 25605  5   grep--color=auto sleep    25607  0   ##更改現有進程的nice級別   25605(進程 ID) 舊優先順序為 5,新優先順序為 -15   [root@docker-01 ~]# ps axo command,pid,nice |grep sleep   sleep6000                 25605-15   grep--color=auto sleep    25611  0