點擊返回 自學Linux命令行與Shell腳本之路html
4.1-監測程序ps top kill
1. PS命令
linux中的ps命令是Process Status的縮寫。ps命令用來列出系統中當前運行的那些進程。ps命令列出的是當前那些進程的快照,就是執行ps命令的那個時刻的那些進程,若是想要動態的顯示進程信息,就可使用top命令。使用該命令能夠肯定有哪些進程正在運行和運行的狀態、進程是否結束、進程有沒有僵死、哪些進程佔用了過多的資源等等。mysql
ps的3種不一樣類型的命令行參數:linux
- UNIX 風格,選項能夠組合在一塊兒,而且選項前必須有「-」連字符(主要此風格)
- BSD 風格,選項能夠組合在一塊兒,可是選項前不能有「-」連字符
- GNU 風格的長選項,選項前有兩個「-」連字符
ps參數:sql
- -A 列出全部的進程
- -w 顯示加寬能夠顯示較多的資訊
- -au 顯示較詳細的資訊
- -aux 顯示全部包含其餘使用者的行程
- -a 顯示一個終端的全部進程,除了會話引線
- -N 忽略選擇。
- -d 顯示全部進程,但省略全部的會話引線(utility)
- -x 顯示沒有控制終端的進程,同時顯示各個命令的具體路徑。dx不可合用。(utility)
- -p pid 進程使用cpu的時間
- -u uid or username 選擇有效的用戶id或者是用戶名
- -g gid or groupname 顯示組的全部進程。
- U username 顯示該用戶下的全部進程,且顯示各個命令的詳細路徑。如:ps U zhang;(utility)
- -f 所有列出,一般和其餘選項聯用。如:ps -fa or ps -fx and so on.
- -l 長格式(有F,wchan,C 等字段)
- -j 做業格式
- -o 用戶自定義格式。
- v 以虛擬存儲器格式顯示
- s 以信號格式顯示
- -m 顯示全部的線程
- -H 顯示進程的層次(和其它的命令合用,如:ps -Ha)(utility)
- e 命令以後顯示環境(如:ps -d e; ps -a e)(utility)
- h 不顯示第一行
經常使用的參數組合數據庫
- ps aux 查看系統全部的進程數據
- ps ax 查看不與terminal有關的全部進程
- ps -lA 查看系統全部的進程數據
- ps axjf 查看連同一部分進程樹狀態



- USER 用戶名
- UID 用戶ID(User ID)
- PID 進程ID(Process ID)
- %CPU 進程的cpu佔用率
- %MEM 進程的內存佔用率
- VSZ 進程所使用的虛存的大小(Virtual Size)
- RSS 進程使用的駐留集大小或者是實際內存的大小,Kbytes字節。
- TTY 與進程關聯的終端(tty)
- STAT 進程的狀態:進程狀態使用字符表示的(STAT的狀態碼)
R 運行 Runnable (on run queue) 正在運行或在運行隊列中等待。
S 睡眠 Sleeping 休眠中, 受阻, 在等待某個條件的造成或接受到信號。
I 空閒 Idle
Z 僵死 Zombie(a defunct process) 進程已終止, 但進程描述符存在, 直到父進程調用wait4()系統調用後釋放。
D 不可中斷 Uninterruptible sleep (ususally IO) 收到信號不喚醒和不可運行, 進程必須等待直到有中斷髮生。
T 終止 Terminate 進程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信號後中止運行運行。
P 等待交換頁
W 無駐留頁 has no resident pages 沒有足夠的記憶體分頁可分配。
X 死掉的進程
< 高優先級進程 高優先序的進程
N 低優先 級進程 低優先序的進程
L 內存鎖頁 Lock 有記憶體分頁分配並縮在記憶體內
s 進程的領導者(在它之下有子進程);
l 多進程的(使用 CLONE_THREAD, 相似 NPTL pthreads)
+ 位於後臺的進程組
- START 進程啓動時間和日期
- TIME 進程使用的總cpu時間
- COMMAND 正在執行的命令行命令
ps -lapache

- F 內核分配給進程的系統標記
- S 進程的狀態
- PPID 父進程的進程號
- NI 優先級(Nice)
- PRI 進程優先級編號(Priority)
- ADDR 進程的內存地址
- SZ 假如進程被換出,所需交換空間的大體大小
- WCHAN 進程正在睡眠的內核函數名稱;該函數的名稱是從/root/system.map文件中得到的。
ps -ef 參數組合使用數組

2. top命令
top命令是Linux下經常使用的性能分析工具,可以實時顯示系統中各個進程的資源佔用情況,經常使用於服務端性能分析。緩存

top命令的結果分爲兩個部分:服務器
- 統計信息:前五行是系統總體的統計信息;
- 進程信息:統計信息下方相似表格區域顯示的是各個進程的詳細信息,默認5秒刷新一次。
統計信息說明:ide
- 第1行:Top 任務隊列信息(系統運行狀態及平均負載),與uptime命令結果相同。
- 第1段:系統當前時間,例如:16:07:37
- 第2段:系統運行時間,未重啓的時間,時間越長系統越穩定。
- 格式:up xx days, HH:MM
- 例如:241 days, 20:11, 表示連續運行了241天20小時11分鐘
- 第3段:當前登陸用戶數,例如:1 user,表示當前只有1個用戶登陸
- 第4段:系統負載,即任務隊列的平均長度,3個數值分別統計最近1,5,15分鐘的系統平均負載
- 系統平均負載:單核CPU狀況下,0.00 表示沒有任何負荷,1.00表示恰好滿負荷,超過1側表示超負荷,理想值是0.7;
- 多核CPU負載:CPU核數 * 理想值0.7 = 理想負荷,例如:4核CPU負載不超過2.8何表示沒有出現高負載。
- 第2行:Tasks 進程相關信息
- 第1段:進程總數,例如:Tasks: 231 total, 表示總共運行231個進程
- 第2段:正在運行的進程數,例如:1 running,
- 第3段:睡眠的進程數,例如:230 sleeping,
- 第4段:中止的進程數,例如:0 stopped,
- 第5段:殭屍進程數,例如:0 zombie
- 第3行:Cpus CPU相關信息,若是是多核CPU,按數字1可顯示各核CPU信息,此時1行將轉爲Cpu核數行,數字1能夠來回切換。
- 第1段:
us
用戶空間佔用CPU百分比,例如:Cpu(s): 12.7%us,
- 第2段:
sy
內核空間佔用CPU百分比,例如:8.4%sy,
- 第3段:
ni
用戶進程空間內改變過優先級的進程佔用CPU百分比,例如:0.0%ni,
- 第4段:
id
空閒CPU百分比,例如:77.1%id,
- 第5段:
wa
等待輸入輸出的CPU時間百分比,例如:0.0%wa,
- 第6段:
hi
CPU服務於硬中斷所耗費的時間總額,例如:0.0%hi,
- 第7段:
si
CPU服務於軟中斷所耗費的時間總額,例如:1.8%si,
- 第8段:
st
Steal time 虛擬機被hypervisor偷去的CPU時間(若是當前處於一個hypervisor下的vm,實際上hypervisor也是要消耗一部分CPU處理時間的)
- 第4行:Mem 內存相關信息(Mem: 12196436k total, 12056552k used, 139884k free, 64564k buffers)
- 第1段:物理內存總量,例如:Mem: 12196436k total,
- 第2段:使用的物理內存總量,例如:12056552k used,
- 第3段:空閒內存總量,例如:Mem: 139884k free,
- 第4段:用做內核緩存的內存量,例如:64564k buffers
- 第5行:Swap 交換分區相關信息(Swap: 2097144k total, 151016k used, 1946128k free, 3120236k cached)
- 第1段:交換區總量,例如:Swap: 2097144k total,
- 第2段:使用的交換區總量,例如:151016k used,
- 第3段:空閒交換區總量,例如:1946128k free,
- 第4段:緩衝的交換區總量,3120236k cached
- A: PID = (Process Id) 進程Id;
- E: USER = (User Name) 進程全部者的用戶名;
- H: PR = (Priority) 優先級
- I: NI = (Nice value) nice值。負值表示高優先級,正值表示低優先級
- O: VIRT = (Virtual Image (kb)) 進程使用的虛擬內存總量,單位kb。VIRT=SWAP+RES
- Q: RES = (Resident size (kb)) 進程使用的、未被換出的物理內存大小,單位kb。RES=CODE+DATA
- T: SHR = (Shared Mem size (kb)) 共享內存大小,單位kb
- W: S = (Process Status) 進程狀態。D=不可中斷的睡眠狀態,R=運行,S=睡眠,T=跟蹤/中止,Z=殭屍進程
- K: %CPU = (CPU usage) 上次更新到如今的CPU時間佔用百分比
- N: %MEM = (Memory usage (RES)) 進程使用的物理內存百分比
- M: TIME+ = (CPU Time, hundredths) 進程使用的CPU時間總計,單位1/100秒
- X: COMMAND = (Command name/line) 命令名/命令行
top命令選項
- -b:以批處理模式操做;
- -c:顯示完整的治命令;
- -d:屏幕刷新間隔時間;
- -I:忽略失效過程;
- -s:保密模式;
- -S:累積模式;
- -i<時間>:設置間隔時間;
- -u<用戶名>:指定用戶名;
- -p<進程號>:指定進程;
- -n<次數>:循環顯示的次數。
3. kill命令
終止進程的工具 kill 、killall、pkill、xkill
終止一個進程或終止一個正在運行的程序,通常是經過 kill 、killall、pkill、xkill 等進行。好比一個程序已經死掉,但又不能退出,這時就應該考慮應用這些工具。
另外應用的場合就是在服務器管理中,在不涉及數據庫服務器程序的父進程的中止運行,也能夠用這些工具來終止。爲何數據庫服務器的父進程不能用這些工具殺死呢?緣由很簡單,這些工具在強行終止數據庫服務器時,會讓數據庫產生更多的文件碎片,當碎片達到必定程度的時候,數據庫就有崩潰的危險。好比mysql服務器最好是按其正常的程序關閉,而不是用pkill mysqld 或killall mysqld 這樣危險的動做;固然對於佔用資源過多的數據庫子進程,咱們應該用kill 來殺掉。
3.1 kill kill的應用是和ps 或pgrep 命令結合在一塊兒使用的;
kill [信號代碼] 進程ID
- -l <信息編號> 若不加<信息編號>選項,則-l參數會列出所有的信息名稱。
- -s <信息名稱或編號> 指定要送出的信息。
- [程序] [程序]能夠是程序的PID或是PGID,也能夠是工做編號。
注:信號代碼能夠省略;咱們經常使用的信號代碼是 -9 ,表示強制終止;

舉例:
[root@localhost ~]# ps auxf |grep httpd
root 4939 0.0 0.0 5160 708 pts/3 S+ 13:10 0:00 /_ grep httpd
root 4830 0.1 1.3 24232 10272 ? Ss 13:02 0:00 /usr/sbin/httpd
apache 4833 0.0 0.6 24364 4932 ? S 13:02 0:00 /_ /usr/sbin/httpd
apache 4834 0.0 0.6 24364 4928 ? S 13:02 0:00 /_ /usr/sbin/httpd
apache 4835 0.0 0.6 24364 4928 ? S 13:02 0:00 /_ /usr/sbin/httpd
apache 4836 0.0 0.6 24364 4928 ? S 13:02 0:00 /_ /usr/sbin/httpd
apache 4840 0.0 0.6 24364 4928 ? S 13:02 0:00 /_ /usr/sbin/httpd
咱們看上面例子中的第二列,就是進程PID的列,其中4830是httpd服務器的父進程,從4833-4840的進程都是它4830的子進程;若是咱們殺掉父進程4830的話,其下的子進程也會跟着死掉;
[root@localhost ~]# kill 4840 注:殺掉4840這個進程;
[root@localhost ~]# ps -auxf |grep httpd 注:查看一下會有什麼結果?是否是httpd服務器仍在運行?
[root@localhost ~]# kill 4830 注:殺掉httpd的父進程;
[root@localhost ~]# ps -aux |grep httpd 注:查看httpd的其它子進程是否存在,httpd服務器是否仍在運行?
對於殭屍進程,能夠用kill -9 來強制終止退出;
好比一個程序已經完全死掉,若是kill 不加信號強度是沒有辦法退出,最好的辦法就是加信號強度 -9 ,後面要接殺父進程;好比;
[root@localhost ~]# ps aux |grep gaim
beinan 5031 9.0 2.3 104996 17484 ? S 13:23 0:01 gaim
root 5036 0.0 0.0 5160 724 pts/3 S+ 13:24 0:00 grep gaim
或 [root@localhost ~]# pgrep -l gaim
5031 gaim
[root@localhost ~]# kill -9 5031
2. killall
killall 經過程序的名字,直接殺死全部進程
用法:killall 正在運行的程序名 killall 也和ps或pgrep 結合使用,比較方便;經過ps或pgrep 來查看哪些程序在運行;
舉例:
[root@localhost beinan]# pgrep -l gaim
2979 gaim
[root@localhost beinan]# killall gaim
3. pkill
pkill 和killall 應用方法差很少,也是直接殺死運行中的程序;若是您想殺掉單個進程,請用kill 來殺掉。
應用方法: #pkill 正在運行的程序名
舉例:
[root@localhost beinan]# pgrep -l gaim
2979 gaim
[root@localhost beinan]# pkill gaim
4. xkill
xkill 是在桌面用的殺死圖形界面的程序。
好比當firefox 出現崩潰不能退出時,點鼠標就能殺死firefox 。當xkill運行時出來和我的電腦的圖標,哪一個圖形程序崩潰一點就OK了。若是您想終止xkill ,就按右鍵取消;
xkill 調用方法:
[root@localhost ~]# xkill