Linux中checkdir命令,鳥哥的 Linux 私房菜

5.2.2:觀察程序的工具指令

程序的觀察大多使用 ps, pstree, top 等指令,不過最好根據觀察的對象來學習!底下列出幾個常見的觀察對象與所使用的指令對應。

ps -l :僅觀察 bash 自己相關的程序

如果使用者僅想知道目前的 bash 界面相關的程序,可以使用簡易的 ps -l 即可!輸出界面示意:

[student@localhost ~]$ ps -l

F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD

0 S 1000 1685 1684 0 80 0 - 29011 wait pts/0 00:00:00 bash

0 R 1000 4958 1685 0 80 0 - 34343 - pts/0 00:00:00 ps

每個項目的意義簡單說明如下:

F (flag):代表程序的總結旗標,常見為 4 代表 root

S (stat):狀態列,主要的分類項目有:

R (Running):該程式正在運作中;

S (Sleep):該程式目前正在睡眠狀態(idle),但可以被喚醒(signal)。

D :不可被喚醒的睡眠狀態,通常這支程式可能在等待 I/O 的情況(ex>列印)

T :停止狀態(stop),可能是在工作控制(背景暫停)或除錯 (traced) 狀態;

Z (Zombie):僵屍狀態,程序已經終止但卻無法被移除至記憶體外。

UID/PID/PPID:代表『此程序被該 UID 所擁有/程序的 PID 號碼/此程序的父程序 PID 號碼』

C:代表 CPU 使用率,單位為百分比;

PRI/NI:Priority/Nice 的縮寫,代表此程序被 CPU 所執行的優先順序,數值越小代表該程序越快被 CPU 執行。

ADDR/SZ/WCHAN:都與記憶體有關,ADDR 是 kernel function,指出該程序在記憶體的哪個部分,如果是個

running 的程序,一般就會顯示『 - 』 / SZ 代表此程序用掉多少記憶體 / WCHAN 表示目前程序是否運作中,同樣的, 若為 - 表示正在運作中。

TTY:登入者的終端機位置,若為遠端登入則使用動態終端介面 (pts/n);

TIME:使用掉的 CPU 時間,注意,是此程序實際花費 CPU 運作的時間,而不是系統時間;

CMD:就是 command 的縮寫,造成此程序的觸發程式之指令為何。

上述的 PPID 即是父程序之意,因此 ps 的 PID 是 4958 而 PPID 是 1685,至於 1685 這個 PID 的主人就是 bash 。

而因為 bash 大部分在提供使用者一個輸入的界面,因此並沒有在執行 (run),故大部分的時間其實是在等待使用者輸入指令,

因此上面讀者應該可以發現到 bash 的 S (state) 狀態為 S (sleep) 。

使用 pstree 與 ps aux 觀察全系統的程序

觀察全系統程序的方式主要有兩種,一種是程序關聯樹,亦即 pstree ,他相對簡單很多。為了顯示的方便,建議讀者可以下達 -A 的選項,

以 ASCII 的顯示字元輸出,比較不容易出現亂碼:

[student@localhost ~]$ pstree -A

systemd-+-ModemManager---2*[{ModemManager}]

|-NetworkManager---2*[{NetworkManager}]

.......(中間省略)......

|-gnome-shell-cal---4*[{gnome-shell-cal}]

|-gnome-terminal--+-bash---pstree

| |-gnome-pty-helpe

| `-3*[{gnome-terminal-}]

.......(底下省略)......

讀者可以看到使用者透過圖形界面的 gnome-terminal 來取得 bash ,然後再以 bash 來啟動 pstree 的情況。若需要加上 PID 與使用者資料,

可以直接使用 -up 來加入即可。

[student@localhost ~]$ pstree -Aup

systemd(1)-+-ModemManager(822)-+-{ModemManager}(838)

| `-{ModemManager}(863)

|-NetworkManager(921)-+-{NetworkManager}(931)

| `-{NetworkManager}(936)

.......(中間省略)......

|-gnome-shell-cal(16734,student)-+-{gnome-shell-cal}(16741)

| |-{gnome-shell-cal}(16784)

| |-{gnome-shell-cal}(16785)

| `-{gnome-shell-cal}(16891)

|-gnome-terminal-(17301,student)-+-bash(17308)---pstree(17705)

| |-gnome-pty-helpe(17307)

| |-{gnome-terminal-}(17302)

| |-{gnome-terminal-}(17303)

| `-{gnome-terminal-}(17304)

.......(底下省略)......

需要注意的是,當父程序、子程序的擁有者不同時,在程式名稱後面才會加上使用者的資訊,否則會省略使用者的名稱。而因為同一隻程式會產生多個程序,

因此每個程序就會有獨立的 PID,這也需要特別注意。

除了較簡易的 pstree 之外,讀者最好也能夠記憶 ps aux 這一個指令的用途,這個指令可以將系統中的程序呼叫出來,且輸出的資訊較為豐富。

顯示的資訊有點像這樣:

[student@localhost ~]$ ps aux

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

root 1 0.0 0.4 128236 9068 ? Ss 6月13 1:02 /usr/lib/systemd/systemd ...

root 2 0.0 0.0 0 0 ? S 6月13 0:00 [kthreadd]

root 3 0.0 0.0 0 0 ? S 6月13 0:00 [ksoftirqd/0]

root 7 0.0 0.0 0 0 ? S 6月13 0:00 [migration/0]

root 8 0.0 0.0 0 0 ? S 6月13 0:00 [rcu_bh]

.......(中間省略)......

student 17301 0.1 1.0 728996 22508 ? Sl 18:34 0:01 /usr/libexec/gnome-terminal-server

student 17307 0.0 0.0 8480 720 ? S 18:34 0:00 gnome-pty-helper

student 17308 0.0 0.1 116156 2864 pts/1 Ss+ 18:34 0:00 bash

.......(底下省略)......

每一個項目代表的意義簡易說明如下:

USER:該 process 屬於那個使用者帳號的?

PID :該 process 的程序識別碼。

%CPU:該 process 使用掉的 CPU 資源百分比;

%MEM:該 process 所佔用的實體記憶體百分比;

VSZ :該 process 使用掉的虛擬記憶體量 (Kbytes)

RSS :該 process 佔用的固定的記憶體量 (Kbytes)

TTY :該 process 是在那個終端機上面運作,若與終端機無關則顯示 ?,另外, tty1-tty6

是本機上面的登入者程序,若為 pts/0 等等的,則表示為由網路連接進主機的程序。

STAT:該程序目前的狀態,狀態顯示與 ps -l 的 S 旗標相同 (R/S/T/Z)

START:該 process 被觸發啟動的時間;

TIME :該 process 實際使用 CPU 運作的時間。

COMMAND:該程序的實際指令為何?

top 動態觀察程序

讀者亦可以透過 top 這個指令來觀察程序的動態資訊。top 可以協助讀者未來在管理程序的 CPU 使用量上面的一個很重要的工具。

直接輸入 top 即可每 5 秒鐘更新一次程序的現況,如下表所示:

[student@localhost ~]$ top

top - 19:02:56 up 21 days, 19:16, 3 users, load average: 0.00, 0.01, 0.05

Tasks: 184 total, 1 running, 183 sleeping, 0 stopped, 0 zombie

%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st

KiB Mem : 2048964 total, 172968 free, 517972 used, 1358024 buff/cache

KiB Swap: 2097148 total, 2096800 free, 348 used. 1283612 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

18432 student 20 0 146148 2120 1436 R 0.5 0.1 0:00.09 top

1 root 20 0 128236 9068 2640 S 0.0 0.4 1:02.41 systemd

2 root 20 0 0 0 0 S 0.0 0.0 0:00.43 kthreadd

3 root 20 0 0 0 0 S 0.0 0.0 0:00.01 ksoftirqd/0

7 root rt 0 0 0 0 S 0.0 0.0 0:00.42 migration/0

8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh

9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/0

10 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/1

11 root 20 0 0 0 0 S 0.0 0.0 1:05.20 rcu_sched

每一行的意義說明如下:

top - 19:02:56 up 21 days, 19:16, 3 users, load average: 0.00, 0.01, 0.05

代表目前為 19:02:56 ,本系統開機了 21 天又 19:16 這的久的時間,目前有 3 為用戶登入,工作負載為 0, 0.01 及 0.05 。

那三個數據代表 1, 5, 15 分鐘內的平均工作負載。所謂的工作負載為『單一時間內,CPU 需要運作幾個工作』之意,並非 CPU 使用率。

如果 CPU 數量有 8 核心,那麼此數據低於 8 是可接受的 (每一個核心全心負責一個工作之意)。

Tasks: 184 total, 1 running, 183 sleeping, 0 stopped, 0 zombie

目前共有 184 個程序,其中 1 個在執行,183 個睡著了,沒有停止與殭屍程序。

%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st

這裡才是 CPU 的使用率百分比,比較需要注意 id (idle) 與 wa (I/O wait),id 越高代表系統越閒置,

wa 越高代表程序卡在讀寫磁碟或網路上,此時系統效能會比較糟糕。

KiB Mem : 2048964 total, 172968 free, 517972 used, 1358024 buff/cache

KiB Swap: 2097148 total, 2096800 free, 348 used. 1283612 avail Mem

分別代表實體記憶體與記憶體置換 (swap) 的總量,與使用量。需要注意的是,上表中雖然 free 僅有 172968K,但是後續有 1358024 buff/cache (快取) 的量,

所謂的快取指的是 Linux 會將系統曾經取用的檔案暫存在記憶體,以加速未來存取該檔案的效能 (記憶體的速度比磁碟快了 10 倍以上),

當記憶體不足時,系統就會將快取回收,以保持系統的可用性。因此全部可用的記憶體為 free + cache !

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

top 程式執行的狀態列,每個項目的意義為:

PID :每個 process 的識別碼 (PID)

USER:該 process 所屬的使用者;

PR :Priority 的簡寫,程序的優先執行順序,越小越早被執行;

NI :Nice 的簡寫,與 Priority 有關,也是越小越早被執行;

%CPU:CPU 的使用率;

%MEM:記憶體的使用率;

TIME+:CPU 使用時間的累加;

COMMAND:指令

在預設的情況下,top 所顯示的程序會以 CPU 的使用率來排序,這也是管理員最需要的一個觀察任務。許多時候系統發生資源不足或者是效能變差的時候,

最簡易的方法為使用 top 觀察最忙碌的幾隻程序,藉以處理程序的效能問題。此外,也能透過 top 觀察 I/O wait 的 CPU 使用率,

可以找到 I/O 最頻繁的幾隻程序,藉以了解到哪些程序在進行哪些行為,或者是系統效能的瓶頸,藉以作為未來升級硬體的依據。

例題:

透過各種方法,找到 PID 為 1 的那隻程序的指令名稱為何?

使用 student 身份登入系統後,(1)使用 su - 切換身份,再 (2)使用 su - student,再 (3) su - 切換成 root,此時再以 ps -l 觀察目前相關的程序情況

根據分析上述的程序相依性,你需要使用幾次 exit 才能回到原本的 student 帳號?

寫出至少兩種方法,找出名為 crond 的程序的 PID 號碼。

由於管理員僅需要知道 PID, PRI, NI 及指令名稱四個欄位,請使用 man ps 找到 example 的範例,透過 ps 搭配適當的選項來列出這四個欄位的程序輸出。

使用 man ps 找到 sort 排序的選項,然後以指令 (comm) 為排序的標準來排序輸出 PID, PRI, NI 與指令。

如何以 top 每兩秒鐘更新一次畫面。

進入 top 的觀察界面後,可以按下哪兩個按鍵,在 CPU 排序與記憶體使用量排序間切換?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值