進程的查看與管理
在linux中,我們可以通過fg、bg、jobs、kill等來對工作進行管理和調度,這些工作都是我們手動執行的,而那些由系統開啟的工作該如何管理呢?管理這些後台工作我們可以使用兩種命令ps和top
[root@localhost ~]# ps 靜態進程管理命令,可以幫助我們查看到ps命令在執行那一刻後台進程的狀態
-A 所有進程,等同於-ax
-a 顯示所有進程(與終端有關的除外)
-x 與參數a一起使用等同於-A
-u 顯示指定用戶的進程
-l 長格式
-f 完整輸出
-t 從指定終端啟動的進程
-C 執行指定命令的進程
[root@localhost ~]# ps aux 查看系統後台的所有進程
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 252828 11580 ? Ss 10月23 0:04 /us...
root 2 0.0 0.0 0 0 ? S 10月23 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? I< 10月23 0:00 [rcu_gp]
root 4 0.0 0.0 0 0 ? I< 10月23 0:00 [rcu_par_gp]
root 6 0.0 0.0 0 0 ? I< 10月23 0:00 [kworker/0:0H-kblockd]
root 8 0.0 0.0 0 0 ? I< 10月23 0:00 [mm_percpu_wq]
root 9 0.0 0.0 0 0 ? S 10月23 0:00 [ksoftirqd/0]
USER 開啟進程的用戶
PID 進程的識別號
%CPU 進程的cpu占用率
%MEM 進程的物理內存占用率
VSZ 虛擬內存用量,單位Kbytes
RSS 物理內存占用量 Kbytes
TTY 那個終端開啟的
STAT 進程的狀態
START 開啟時間
TIME CPU占用時間
COMMAND 執行具體內容
[root@localhost ~]# ps -l 查看當前用戶開啟的進程
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 0 5191 5189 0 80 0 - 6994 - pts/1 00:00:02 bash
0 R 0 14972 5191 0 80 0 - 11240 - pts/1 00:00:00 ps
F 進程標識 4=權限為root 1=從父進程派生出來但是沒有執行 5=1+4 0=沒有被設置
S 進程狀態 R=運行 S=睡眠,可被喚醒 D=睡眠,不可被喚醒(資源不足引起)T=停止
Z=殭屍進程
UID 用戶識別號
PID 進程識別號
PPID 父進程號
C cpu使用率 %
PRI 內核調度優先級
NI 用戶設置優先級
ADDR 加載到內存的位置,如果是運行的會用-表示
SZ 用掉的內存頁的大小,1個內存頁=4096Bytes 也就是6994x4=27976K內存
WCHAN 當前進程在哪個內核函數上睡眠,-表示正在運行,沒有睡眠
TTY 由哪個終端開啟的 pts/n=圖形介面或遠程 ttyn=字符介面 ?=系統進程
TIME 用掉的CPU時間
CMD 執行的命令
ps只能顯示它運行的那一刻的進程的統計信息,如果你想動態的查看就需要使用top
top動態查看
[root@localhost ~]# top
-d 指定兩次刷新的時間間隔,默認是3秒
-p 後面跟進程號,查看指定進程的狀態,最多20個PID
-n 刷新指定次數後退出
-b 批量模式,可以讓top將內容輸出到指定的位置
top的按鍵
? 顯示幫助
空格&enter 刷新
E 切換統計信息部分,內存顯示的單位
e 切換任務列表的內存顯示的單位
l 顯示或隱藏摘要信息中的負載統計(第一行內容)
t 切換顯示或隱藏摘要信息中任務和CPU統計信息(第2,3行內容)
m 切換顯示或隱藏摘要信息中內存統計(第4,5行內容)
u 查看指定用戶的進程
M 根據內存排序
P 根據cpu排序
N 根據PID排序
R 反向排序
F/f 調整任務列表顯示的內容,默認只有PID,USER,PR,NI....COMMAND等這些,可 以自定義還需要顯示哪些內容,如果顯示的列比較多可以使用>進行左右移動
shift+>按照下一列的內容排序,比如說當前按照PID排序如果按下shift+>,則按照用戶名 排序,再次按下就會按照PR排序,一次類推
T 根據cpu使用時間排序
k 殺死進程
r 修改進程的nice值(優先級)
z 將不同的位置標記顏色
x 高亮顯示排序欄位
y 高亮顯示正在運行的任務
b 將高亮顯示部分加上背景色
Z 自定義顏色
L 搜索指定欄位,&下一個
H 在進程和線程間切換顯示和統計方式,默認為進程
V 樹形顯示統計信息
J 顯示內容左對齊或右對齊
c 切換COMMAND列的顯示形式,程序名/命令格式
i 顯示或隱藏空閒進程
u/U 查看指定用戶的進程
d 設置刷新間隔,默認3秒刷新一次
W 將當前的設置寫入到~/.config/procps/toprc中
q 退出top
[root@localhost ~]# top -d 1
1 top - 18:57:05 up 12:56, 3 users, load average: 0.00, 0.00, 0.00
2 Tasks: 280 total, 1 running, 279 sleeping, 0 stopped, 0 zombie
3 %Cpu(s): 1.5 us,1.5 sy,0.0 ni,97.0 id,0.0 wa,0.0 hi,0.0 si,0.0 st
4 MiB Mem : 3918.6 total, 160.1 free, 1264.5 used, 2494.0 buff/cache
5 MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 2356.6 avail Mem
6
7PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 244408 13740 9100 S 0.0 0.3 0:08.77 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.04 kthreadd 3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp 4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 cu_par_gp
1-6行顯示的內容為
1 當前時間為18:57:05;系統一共開機12小時56分;當前有3個用戶登錄;系統在1,5,15分鐘的平均負載,越小表示系統越空閒
2 系統中進程的統計信息 總計280個,1個運行,279睡眠,0個停止,0個殭屍
3 cpu的負載 按鍵盤上的「1」可以按照CPU核心數顯示
us: 用戶空間進程占用CPU時間百分比
sy: 內核進程占用CPU時間百分比
ni: 用戶空間內改變過優先級的進程占用CPU時間百分比
id: 空閒CPU時間百分比(100%表示系統完全空閒)
wa: I/O等待占用的CPU時間百分比
hi: 硬體中斷占用CPU時間百分比
si: 軟體中斷占用CPU時間百分比
st: 虛擬化hypervisor從當前虛擬機偷走的時間(如果這個值很高的話,說明你的提 供商的CPU資源有限,而你沒能搶過別人,很有可能就是VPS提供商超售了.)
4&5 物理內存和虛擬內存相關的統計信息,尤其要注意swap,如果被大量占用,說明你物理內 存不足了
6 在top中輸入命令時,會顯示在這裡
7 系統進程的信息
PID
USER
PR
NI
VIRT
RES
SHR
S
%CPU
%MEM
TIME+
COMMAND
top顯示的內容有些看不到怎麼辦?
[root@localhost ~]# top -b -n1 > /tmp/top.txt
有些時候想查看的進程資源占用很低,在top中顯示的比較靠後,怎麼辦?
[root@localhost ~]# top -d 2 -p 3562
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
%Cpu(s): 2.2 us, 3.9 sy, 0.0 ni, 93.3 id, 0.0 wa, 0.5 hi, 0.1 si, 0.0 st
MiB Mem : 3918.6 total, 1495.1 free, 1407.0 used, 1016.5 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 2258.4 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3562 root 20 0 49296 6380 4448 S 0.0 0.2 0:00.08 bash
上面所提到的兩個查看系統進程的命令,靜態的ps和動態的top,他們所顯示的內容比較多,有的時候我只想查看一下進程之間的關係,這個時候我可以使用另外的一條命令
[root@localhost ~]# pstree
A 進程之間使用ASCII字符連接
U 進程之間使用UTF-8編碼連接
p 顯示進程號
u 顯示用戶
[root@localhost ~]# pstree -A | more
systemd-+-ModemManager---2*[{ModemManager}]
|-NetworkManager---2*[{NetworkManager}]
|-VGAuthService
|-accounts-daemon---2*[{accounts-daemon}]
|-alsactl
|-atd
|-auditd-+-sedispatch
| `-2*[{auditd}]
[root@localhost ~]# pstree -U | more
systemd─┬─ModemManager───2*[{ModemManager}]
├─NetworkManager───2*[{NetworkManager}]
├─VGAuthService
├─accounts-daemon───2*[{accounts-daemon}]
├─alsactl
├─atd
├─auditd─┬─sedispatch
│ └─2*[{auditd}]
[root@localhost ~]# pstree -pu | more
systemd(1)-+-ModemManager(916)-+-{ModemManager}(943)
| `-{ModemManager}(949)
|-NetworkManager(1040)-+-{NetworkManager}(1050)
| `-{NetworkManager}(1053)
|-VGAuthService(902)
|-accounts-daemon(1010)-+-{accounts-daemon}(1013)
| `-{accounts-daemon}(1015)
|-alsactl(909)
|-atd(1076)
|-auditd(862)-+-sedispatch(864)
| |-{auditd}(863)
| `-{auditd}(865)
|-avahi-daemon(910,avahi)---avahi-daemon(953)
我們現在可以通過三種方法來查看後台的進程,那麼後台的進程該如何管理呢?管理後台的進程,除了我們前面提到的kill命令之外還可以使用killall
[root@localhost ~]# kill PID
需要注意的是,kill後面如果加的是%num代表殺死後台指定序號的工作,如果不加%代表的是殺死指定進程號的進程,這兩個是有區別的
[root@localhost ~]# killall
e 精確匹配,最多不能超過15個字符
i 詢問用戶是否殺死指定名稱的進程
I 進程的名稱忽略大小寫
[root@localhost ~]# cat /dev/zero > /dev/null &
[1] 102245
[root@localhost ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 0 3562 3559 0 80 0 - 12324 - pts/1 00:00:00 bash
0 R 0 102245 3562 97 80 0 - 1908 - pts/1 00:00:01 cat
0 R 0 102246 3562 0 80 0 - 11240 - pts/1 00:00:00 ps
[root@localhost ~]# killall -ei cat
殺死 cat(102870) ? (y/N) y
[1]+ 已終止 cat /dev/zero > /dev/null