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