Liunx進程管理(2)

2020-09-22     藝麟盛世

原標題:Liunx進程管理(2)

進程的查看與管理

在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

文章來源: https://twgreatdaily.com/zh-hk/gRB5tXQBd8y1i3sJR2B_.html