在Linux 中查看進程通常可以通過ps 和top 兩個命令。ps 展示的是當前Linux 正在活動的進程快照,top 展示的是當前Linux 實時的進程情況。
一、PS 命令
Linux 可以使用ps 來顯示當前活動的進程(process)狀態
# wentong @ wentongdeMacBook-Pro in ~ [12:42:52]
$ ps
PID TTY TIME CMD
11583 ttys000 0:00.03 /Applications/iTerm.app/Contents/MacOS/iTerm2 --server login -fp wentong
11585 ttys000 0:02.93 -zsh
直接使用ps 可以看到當前活動的進程爲iTerm2 和zsh。
衆所周知進程具有5 種狀態:
- 運行狀態:正在運行或在運行隊列中等待[就緒隊列]
- 中斷狀態:休眠中、受阻、等待某個條件形成或接收到信號
- 不可中斷狀態:受到信號不喚醒和不可運行,進程必須等待知道有中斷髮生
- 僵死狀態:進程已經終止,但程序描述符存在,直到父進程調用wait4()系統調用後釋放
- 停止狀態:進程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信號後停止運行運行
ps 工具標示進程的5 種狀態碼:
- R:運行狀態
- D:不可中斷狀態
- S:中斷狀態
- Z:僵死狀態
- T:停止狀態
語法 & 參數
ps 的語法:
ps [options] [--help]
ps 的參數太多了,這裏僅列舉常見參數:
-e 顯示所有進程
-f 全格式
-h 不顯示標題
-l 長格式
a 顯示終端上的所有進程,包括其他用戶的進程。
r 只顯示正在運行的進程。
x 顯示沒有控制終端的進程。
-A 列出所有的行程
-w 顯示加寬可以顯示較多的資訊
-au 顯示較詳細的資訊
-aux 顯示所有包含其他使用者的行程
ps -ef 查看全格式的全部進程
$ ps -ef | sed -n '1,20p
'
UID PID PPID C STIME TTY TIME CMD
0 1 0 0 四12下午 ?? 0:46.31 /sbin/launchd
0 100 1 0 四12下午 ?? 0:12.22 /usr/sbin/syslogd
0 101 1 0 四12下午 ?? 0:17.56 /usr/libexec/UserEventAgent (System)
0 104 1 0 四12下午 ?? 0:01.29 /System/Library/PrivateFrameworks/Uninstall.framework/Resources/uninstalld
0 105 1 0 四12下午 ?? 0:13.86 /usr/libexec/kextd
0 106 1 0 四12下午 ?? 0:21.73 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/FSEvents.framework/Versions/A/Support/fseventsd
0 107 1 0 四12下午 ?? 0:00.92 /System/Library/PrivateFrameworks/MediaRemote.framework/Support/mediaremoted
0 110 1 0 四12下午 ?? 0:24.18 /usr/sbin/systemstats --daemon
0 111 1 0 四12下午 ?? 0:26.44 /usr/libexec/configd
0 112 1 0 四12下午 ?? 0:00.02 endpointsecurityd
0 113 1 0 四12下午 ?? 0:14.63 /System/Library/CoreServices/powerd.bundle/powerd
0 117 1 0 四12下午 ?? 1:04.84 /usr/libexec/logd
0 118 1 0 四12下午 ?? 0:00.13 /usr/libexec/keybagd -t 15
0 121 1 0 四12下午 ?? 0:02.03 /usr/libexec/watchdogd
0 125 1 0 四12下午 ?? 0:25.14 /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Support/mds
240 126 1 0 四12下午 ?? 0:00.05 /System/Library/CoreServices/iconservicesd
0 127 1 0 四12下午 ?? 0:01.34 /usr/libexec/diskarbitrationd
0 130 1 0 四12下午 ?? 0:07.79 /usr/libexec/coreduetd
0 133 1 0 四12下午 ?? 0:22.23 /usr/libexec/opendirectoryd
ps aux 查看全部進程
# wentong @ wentongdeMacBook-Pro in ~ [13:24:31]
$ ps aux | sed -n '1,10p
'
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
wentong 12630 13.2 0.1 4337300 8624 s000 S 1:15下午 0:03.33 -zsh
wentong 12623 5.3 6.2 5591536 516244 ?? R 1:15下午 0:28.36 /Applications/iTerm.app/Contents/MacOS/iTerm2
wentong 11822 3.5 3.2 5477384 264440 ?? S 12:38下午 2:48.23 /Applications/Google Chrome.app/Contents/Frameworks/Google Chrome Framework.framework/Versions/79.0.3945.130/Helpers/Google Chrome Helper (Renderer).app/Contents/MacOS/Google Chrome Helper (Renderer) --type=renderer --field-trial-handle=1718379636,5036629041004742246,4557873199599507931,131072 --lang=zh-CN --metrics-client-id=19af6066-9d85-461e-9d87-0b6a86768289 --enable-auto-reload --num-raster-threads=4 --enable-zero-copy --enable-gpu-memory-buffer-compositor-resources --enable-main-frame-before-activation --service-request-channel-token=6867578928393502030 --renderer-client-id=56 --no-v8-untrusted-code-mitigations --seatbelt-client=76
_hidd 158 1.3 0.1 4382800 8900 ?? Ss 四12下午 1:19.45 /usr/libexec/hidd
_windowserver 238 1.0 0.7 7458932 54752 ?? Ss 四12下午 37:14.67 /System/Library/PrivateFrameworks/SkyLight.framework/Resources/WindowServer -daemon
wentong 11672 0.6 1.1 5018148 90684 ?? S 12:29下午 0:23.45 /Applications/Google Chrome.app/Contents/Frameworks/Google Chrome Framework.framework/Versions/79.0.3945.130/Helpers/Google Chrome Helper (Renderer).app/Contents/MacOS/Google Chrome Helper (Renderer) --type=renderer --field-trial-handle=1718379636,5036629041004742246,4557873199599507931,131072 --lang=zh-CN --metrics-client-id=19af6066-9d85-461e-9d87-0b6a86768289 --enable-auto-reload --num-raster-threads=4 --enable-zero-copy --enable-gpu-memory-buffer-compositor-resources --enable-main-frame-before-activation --service-request-channel-token=11522048665590959820 --renderer-client-id=54 --no-v8-untrusted-code-mitigations --seatbelt-client=76
wentong 455 0.5 0.2 4410372 16104 ?? S 四12下午 0:04.47 /System/Library/CoreServices/Siri.app/Contents/MacOS/Siri launchd
root 136 0.2 0.1 4381720 7720 ?? Ss 四12下午 0:05.88 /System/Library/CoreServices/launchservicesd
wentong 679 0.1 0.2 4907748 14556 ?? Ss 四12下午 0:01.80 /System/Library/CoreServices/Siri.app/Contents/XPCServices/SiriNCService.xpc/Contents/MacOS/SiriNCService
輸出解釋:
USER: 行程擁有者
PID: pid
%CPU: 佔用的 CPU 使用率
%MEM: 佔用的記憶體使用率
VSZ: 佔用的虛擬記憶體大小
RSS: 佔用的記憶體大小
TTY: 終端的次要裝置號碼 (minor device number of tty)
STAT: 該行程的狀態:
START: 行程開始時間
IME: 執行的時間
COMMAND:所執行的指令
二、 top 命令
Linux top命令用於實時顯示 process 的動態
第一行,top
user: 當前登陸的用戶數
load average: 系統平均負載,三個值分別代表過去15分鐘、10分鐘、5分鐘系統的平均負載(單位時間內,系統中處於可運行狀態和不可中斷狀態的平均進程數)
第二行,Tasks
total: 進程總量
running:正在運行的進程數
sleeping:處於休眠狀態的進程數
stopped:處於停止狀態的進程數
zombie:殭屍進程數
第三行,cpu 狀態
us: user space,用戶空間佔CPU 的百分比
sy:sysctl,內核空間佔CPU 的百分比
ni:改變過優先級的進程佔用CPU的百分比
id:idolt,空閒CPU 百分比
wa:wait,IO等待佔用CPU的百分比
hi:Hardware IRQ,硬中斷佔用CPU的百分比
si:Software Interrupts,軟中斷佔用CPU的百分比
第四行,內存狀態
total:可用內存量
free:內核還未納入其管控範圍的數量
used:系統內核控制的內存數
buff/cache:緩存的內存量
納入內核管理的內存不見得都在使用中,還包括過去使用過的現在可以被重複利用的內存,內核並不把這些可被重新使用的內存交還到free中去,因此在linux上free內存會越來越少,但不用爲此擔心。
第五行,sweep 交換分區信息
total:交換區總量
free:空閒交換區總量
used:使用的交換區總量
avail Mem:可用交換取總量
可用內存=free + buffer + cached
對於內存監控,在top裏我們要時刻監控第五行swap交換分區的used,如果這個數值在不斷的變化,說明內核在不斷進行內存和swap的數據交換,這是真正的內存不夠用了。
第六行,進程參數
PID — 進程id
USER — 進程所有者
PR — 進程優先級
NI — nice值。負值表示高優先級,正值表示低優先級
VIRT — 進程使用的虛擬內存總量,單位kb。VIRT=SWAP+RES
RES — 進程使用的、未被換出的物理內存大小,單位kb。RES=CODE+DATA
SHR — 共享內存大小,單位kb
S —進程狀態。D=不可中斷的睡眠狀態 R=運行 S=睡眠 T=跟蹤/停止 Z=殭屍進程
%CPU — 上次更新到現在的CPU時間佔用百分比
%MEM — 進程使用的物理內存百分比
TIME+ — 進程使用的CPU時間總計,單位1/100秒
COMMAND — 進程名稱(命令名/命令行)
詳解:
VIRT:virtual memory usage 虛擬內存
1、進程“需要的”虛擬內存大小,包括進程使用的庫、代碼、數據等
2、假如進程申請100m的內存,但實際只使用了10m,那麼它會增長100m,而不是實際的使用量
RES:resident memory usage 常駐內存
1、進程當前使用的內存大小,但不包括swap out
2、包含其他進程的共享
3、如果申請100m的內存,實際使用10m,它只增長10m,與VIRT相反
4、關於庫佔用內存的情況,它只統計加載的庫文件所佔內存大小
SHR:shared memory 共享內存
1、除了自身進程的共享內存,也包括其他進程的共享內存
2、雖然進程只使用了幾個共享庫的函數,但它包含了整個共享庫的大小
3、計算某個進程所佔的物理內存大小公式:RES – SHR
4、swap out後,它將會降下來
DATA
1、數據佔用的內存。如果top沒有顯示,按f鍵可以顯示出來。
2、真正的該程序要求的數據空間,是真正在運行中要使用的。
top 運行中可以通過 top 的內部命令對進程的顯示方式進行控制。
s – 改變畫面更新頻率
l – 關閉或開啓第一部分第一行 top 信息的表示
t – 關閉或開啓第一部分第二行 Tasks 和第三行 Cpus 信息的表示
m – 關閉或開啓第一部分第四行 Mem 和 第五行 Swap 信息的表示
N – 以 PID 的大小的順序排列表示進程列表
P – 以 CPU 佔用率大小的順序排列進程列表
M – 以內存佔用率大小的順序排列進程列表
h – 顯示幫助
n – 設置在進程列表所顯示進程的數量
q – 退出 top
s – 改變畫面更新週期
參考資料:
Linux ps命令 | 菜鳥教程:https://www.runoob.com/linux/linux-comm-ps.html
Linux top命令 | 菜鳥教程:https://www.runoob.com/linux/linux-comm-top.html
top 命令詳解:https://www.cnblogs.com/niuben/p/12017242.html