在Linux 中查看進程

在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 種狀態:

  1. 運行狀態:正在運行或在運行隊列中等待[就緒隊列]
  2. 中斷狀態:休眠中、受阻、等待某個條件形成或接收到信號
  3. 不可中斷狀態:受到信號不喚醒和不可運行,進程必須等待知道有中斷髮生
  4. 僵死狀態:進程已經終止,但程序描述符存在,直到父進程調用wait4()系統調用後釋放
  5. 停止狀態:進程收到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 的動態

T
第一行,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

發佈了23 篇原創文章 · 獲贊 27 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章