監控系統資源

一、uptimew

Linux 命令,顯示系統已經運行了多長時間,它依次顯示下列信息:當前時間、系統已經運行了多長時間、目前有多少登陸用戶、系統在過去的1分鐘、5分鐘和15分鐘內的平均負載。

uptime 命令可以用來查看服務器已經運行了多久,當前登錄的用戶有多少,以及服務器在過去的1分鐘、5分鐘、15分鐘的系統平均負載值。

平均負載的最佳值是1,這意味着每個進程都可以立即執行不會錯過CPU週期。負載的正常值在不同的系統中有着很大的差別。在單處理器的工作站中,12都是可以接受的。然而在多處理器的服務器上你可能看到810

你能使用uptime來確定是服務器還是網絡出了問題。例如如果網絡應用程序運行,運行uptime來了解系統負載是否很高。如果負載不高,這個問題很有可能是由於網絡引起的而非服務器。

提示:你可以使用 命令來代替 uptime也提供關於當前系統登錄用戶和用戶所進行工作的相關信息。

下面是一個在Linux系統上運行uptimew命令的示例:

[root@instructor Desktop]# uptime

 17:12:53 up  6:22,  3 users,  load average: 0.00, 0.00, 0.00

這裏需要注意的是load average這個輸出值,這三個值的大小一般不能大於系統邏輯CPU的個數,例如,本輸出中系統有4個邏輯CPU,如果load average的三個值長期大於4時,說明CPU很繁忙,負載很高,可能會影響系統性能,但是偶爾大於4時,倒不用擔心,一般不會影響系統性能。相反,如果load average的輸出值小於CPU的個數,則表示CPU還有空閒,比如本例中的輸出,CPU是比較空閒的。

[root@instructor Desktop]# w

 17:14:25 up  6:23,  3 users,  load average: 0.00, 0.00, 0.00

USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT

root     tty1     :0               Tue23    2days 56.54s 56.54s /usr/bin/Xorg :

root     pts/0    :0.0             Tue23    2days  0.55s  0.55s /bin/bash

root     pts/2    :0.0             16:08    1.00s  0.45s  0.41s w

二、Pspstree

1、Ps:將某個時間點的程序運行情況擷取下來

[root@instructor Desktop]# ps aux  <==觀察系統所有的程序數據

[root@instructor Desktop]# ps -lA  <==也是能夠觀察所有系統的數據

[root@instructor Desktop]# ps axjf <==連同部分程序樹狀態

選項與參數:

-A  :所有的 process 均顯示出來,與 -e 具有同樣的效用;

-a  :不與 terminal 有關的所有 process 

-u  :有效使用者 (effective user) 相關的 process 

-x  :通常與 這個參數一起使用,可列出較完整資訊。

-f  :顯示父子進程

-o  :根據進程屬性查看

輸出格式規劃:

l   :較長、較詳細的將該 PID 的的資訊列出;

j   :工作的格式 (jobs format)

-f  :做一個更爲完整的輸出。

範例一:將目前屬於自己這次登陸的 PID 與相關資訊列出來(只與自己的 bash 有關)

[root@instructor Desktop]# ps -l

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

4 S     0 13639 13637  0  75   0 -  1287 wait   pts/1    00:00:00 bash

4 R     0 13700 13639  0  77   0 -  1101 -      pts/1    00:00:00 ps

 

系統整體的程序運行是非常多的,但如果使用 ps -l 則僅列出與你的操作環境 (bash) 有關的程序而已, 亦即最上一級的父程序會是你自己的 bash 而沒有延伸到 init 這支程序去!那麼 ps -l 列出的數據有哪些呢:

F:代表這個程序旗標 (process flags),說明這個程序的總結權限,常見號碼有:

若爲 表示此程序的權限爲 root ; 

若爲 則表示此子程序僅進行復制(fork)而沒有實際運行(exec)。 

S:代表這個程序的狀態 (STAT),主要的狀態有:

R (Running):該程序正在運行中; 

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

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

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

Z (Zombie):殭屍狀態,程序已經終止但卻無法被移除至內存外。 

s(sister):子進程

<:高優先級

n:低優先級

+:後天進程

:鎖定進程

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

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

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

ADDR/SZ/WCHAN:都與內存有關,ADDR 是 kernel function,指出該程序在內存的哪個部分,如果是個 running 的程序,一般就會顯示『 』 / SZ 代表此程序用掉多少內存 / WCHAN 表示目前程序是否運行中,同樣的, 若爲 表示正在運行中。

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

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

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

範例二:列出目前所有的正在內存當中的程序:

[root@instructor Desktop]# ps aux

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

root         1  0.0  0.0   2064   616 ?        Ss   Mar11   0:01 init [5]

root         2  0.0  0.0      0     0 ?        S<   Mar11   0:00 [migration/0]

root         3  0.0  0.0      0     0 ?        SN   Mar11   0:00 [ksoftirqd/0]

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

root     13639  0.0  0.2   5148  1508 pts/1    Ss   11:44   0:00 -bash

root     14232  0.0  0.1   4452   876 pts/1    R+   15:52   0:00 ps aux

root     18593  0.0  0.0   2240   476 ?        Ss   Mar14   0:00 /usr/sbin/atd

 

你會發現 ps -l 與 ps aux 顯示的項目並不相同!在 ps aux 顯示的項目中,各欄位的意義爲:

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

PID :該 process 的程序識別碼。 

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

%MEM:該 process 所佔用的實體內存百分比; 

VSZ :該 process 使用掉的虛擬內存量 (Kbytes) 

RSS :該 process 佔用的固定的內存量 (Kbytes) 

TTY :該 process 是在那個終端機上面運行,若與終端機無關則顯示 ?,另外, tty1-tty6 是本機上面的登陸者程序,若爲 pts/0 等等的,則表示爲由網絡連接進主機的程序。 

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

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

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

COMMAND:該程序的實際命令爲何? 

一般來說,ps aux 會依照 PID 的順序來排序顯示,我們還是以 13639 那個 PID 那行來說明!該行的意義爲:root 運行的 bash PID 爲 13639,佔用了 0.2% 的內存容量百分比,狀態爲休眠 (S),該程序啓動的時間爲 11:44 , 且取得的終端機環境爲 pts/1 。與 ps aux 看到的其實是同一個程序!

範例三:以範例一的顯示內容,顯示出所有的程序:

[root@instructor Desktop]# ps -lA

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

4 S     0     1     0  0  76   0 -   435 -      ?        00:00:01 init

1 S     0     2     1  0  94  19 -     0 ksofti ?        00:00:00 ksoftirqd/0

1 S     0     3     1  0  70  -5 -     0 worker ?        00:00:00 events/0

....(以下省略)....

你會發現每個欄位與 ps -l 的輸出情況相同,但顯示的程序則包括系統所有的程序。

範例四:列出類似程序樹的程序顯示:

[root@instructor Desktop]# ps axjf

 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND

    0     1     1     1 ?           -1 Ss       0   0:01 init [5]

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

    1  4586  4586  4586 ?           -1 Ss       0   0:00 /usr/sbin/sshd

 4586 13637 13637 13637 ?           -1 Ss       0   0:00  \_ sshd: root@pts/1

13637 13639 13639 13639 pts/1    14266 Ss       0   0:00      \_ -bash

13639 14266 14266 13639 pts/1    14266 R+       0   0:00          \_ ps axjf

.....(後面省略).....

範例五:找出與 cron 與 syslog 這兩個服務有關的 PID 號碼?

[root@instructor Desktop]# ps aux | egrep '(cron|syslog)'

root   4286  0.0  0.0  1720   572 ?      Ss  Mar11   0:00 syslogd -m 0

root   4661  0.0  0.1  5500  1192 ?      Ss  Mar11   0:00 crond

root  14286  0.0  0.0  4116   592 pts/1  R+  16:15   0:00 egrep (cron|syslog)

所以號碼是 4286 及 4661 這兩個羅!就是這樣找的啦!

 

除此之外,我們必須要知道的是殭屍(zombie)程序是什麼? 通常,造成殭屍程序的成因是因爲該程序應該已經運行完畢,或者是因故應該要終止了, 但是該程序的父程序卻無法完整的將該程序結束掉,而造成那個程序一直存在內存當中。 如果你發現在某個程序的 CMD 後面還接上 <defunct> 時,就代表該程序是殭屍程序,例如:

apache  8683  0.0  0.9 83384 9992 ?   Z  14:33   0:00 /usr/sbin/httpd <defunct>

 

當系統不穩定的時候就容易造成所謂的殭屍程序,可能是因爲程序寫的不好,或者是使用者的操作習慣不良等等所造成。 如果你發現系統中很多殭屍程序時,要找出該程序的父程序,然後做個追蹤,進行主機的環境最佳化!看看有什麼地方需要改善的,不要只是直接將他 kill 掉而已呢!不然的話,可能他會一直產生,不能杜絕此類情況!

事實上,通常殭屍程序都已經無法控管,而直接是交給 init 這支程序來負責了,偏偏 init 是系統第一支運行的程序, 他是所有程序的父程序!我們無法殺掉該程序的 ,所以,如果產生殭屍程序, 而系統過一陣子還沒有辦法透過核心非經常性的特殊處理來將該程序刪除時,那你只好透過 reboot 的方式來將該程序抹去了!

2、Pstree動態觀察程序的變化

[root@instructor Desktop]# pstree [-A|U] [-up]

選項與參數:

-A  :各程序樹之間的連接以 ASCII 字節來連接;

-U  :各程序樹之間的連接以萬國碼的字節來連接。在某些終端介面下可能會有錯誤;

-p  :並同時列出每個 process 的 PID

-u  :並同時列出每個 process 的所屬帳號名稱。

範例一:列出目前系統上面所有的程序樹的相關性:

[root@instructor Desktop]# pstree -A

init-+-acpid

     |-atd

     |-auditd-+-audispd---{audispd}  <==這行與底下一行爲 auditd 分出來的子程序

     |        `-{auditd}

     |-automount---4*[{automount}]   <==默認情況下,相似的程序會以數字顯示

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

     |-sshd---sshd---bash---pstree   <==就是我們命令運行的那個相依性!

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

範例二:承上題,同時列出 PID 與 users 

[root@instructor Desktop]# pstree -Aup

init(1)-+-acpid(4555)

        |-atd(18593)

        |-auditd(4256)-+-audispd(4258)---{audispd}(4261)

        |              `-{auditd}(4257)

        |-automount(4536)-+-{automount}(4537) <==程序相似但 PID 不同!

        |                 |-{automount}(4538)

        |                 |-{automount}(4541)

        |                 `-{automount}(4544)

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

        |-sshd(4586)---sshd(16903)---bash(16905)---pstree(16967)

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

        |-xfs(4692,xfs)   <==因爲此程序擁有者並非運行 pstree 者!所以列出帳號

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

在括號 () 內的即是 PID 以及該程序的 owner;由於當前用戶爲ROOT所以沒有顯示出來。 

如果要找程序之間的相關性,直接輸入 pstree 可以查到程序相關性,如上表所示,還會使用線段將相關性程序連結起來! 一般連結符號可以使用 ASCII 碼即可,但有時因爲語系問題會主動的以 Unicode 的符號來連結, 但因爲可能終端機無法支持該編碼,或許會造成亂碼問題。因此可以加上 -A 選項來克服此類線段亂碼問題。

由 pstree 的輸出我們也可以很清楚的知道,所有的程序都是依附在 init 這支程序底下的! 仔細看一下,這支程序的 PID 是一號!因爲他是由 Linux 核心所主動呼叫的第一支程序!所以 PID 就是一號了。 這也是我們剛剛提到殭屍程序時有提到遇到殭屍進程是要重啓, 因爲重啓就是重新啓動 init 

如果還想要知道 PID 與所屬使用者,加上 -u 及 -p 兩個參數即可。

三、Top

[root@instructor Desktop]# top [-d 數字] | top [-bnp]

選項與參數:

-d  :後面可以接秒數,就是整個程序畫面升級的秒數。默認是 秒;

-b  :以批量的方式運行 top ,通常會搭配數據流重導向來將批量的結果輸出成爲文件。

-n  :與 -b 搭配,意義是,需要進行幾次 top 的輸出結果。

-p  :指定某些個 PID 來進行觀察監測而已。

在 top 運行過程當中可以使用的按鍵命令:

:顯示在 top 當中可以輸入的按鍵命令;

:以 CPU 的使用資源排序顯示;

:以 Memory 的使用資源排序顯示;

:以 PID 來排序喔!

:由該 Process 使用的 CPU 時間累積 (TIME+) 排序。

:給予某個 PID 一個訊號  (signal)

:給予某個 PID 重新制訂一個 nice 值。

:離開 top 軟件的按鍵。

其實 top 的功能非常多!可以用的按鍵也非常的多!可以參考 man top 的內部說明文件! 

範例一:每兩秒鐘刷新一次 top ,觀察整體資訊:

[root@instructor Desktop]# top -d 2

top - 17:03:09 up 7 days, 16:16,  1 user,  load average: 0.00, 0.00, 0.00

Tasks:  80 total,   1 running,  79 sleeping,   0 stopped,   0 zombie

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

Mem:    742664k total,   681672k used,    60992k free,   125336k buffers

Swap:  1020088k total,       28k used,  1020060k free,   311156k cached

    <==如果加入 或 時,就會有相關的字樣出現在這裏喔!

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

14398 root      15   0  2188 1012  816 R  0.5  0.1   0:00.05 top

    1 root      15   0  2064  616  528 S  0.0  0.1   0:01.38 init

    2 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 migration/0

    3 root      34  19     0    0    0 S  0.0  0.0   0:00.00 ksoftirqd/0

 

top 也是個挺不錯的程序觀察工具!但不同於 ps 是靜態的結果輸出, top 這個程序可以持續的監測整個系統的程序工作狀態。 在默認的情況下,每次刷新程序資源的時間爲 秒,不過,可以使用 -d 來進行修改。 top 主要分爲兩個畫面,上面的畫面爲整個系統的資源使用狀態,基本上總共有六行,顯示的內容依序是:

第一行(top...):這一行顯示的信息分別爲: 

目前的時間,即 17:03:09 ; 

啓動到目前爲止所經過的時間,即 up 7days, 16:16 ; 

已經登陸系統的使用者人數,即 1 user; 

系統在 1, 5, 15 分鐘的平均工作負載。 

第二行(Tasks...):顯示的是目前程序的總量與個別程序在什麼狀態(running, sleeping, stopped, zombie)。 比較需要注意的是最後的 zombie 那個數值,如果不是 !好好看看到底是哪個 process 變成了殭屍進程?

第三行(Cpus...):顯示的是 CPU 的整體負載,每個項目可使用 查閱。需要特別注意的是 %wa ,那個項目代表的是 I/O wait, 通常你的系統會變慢都是 I/O 產生的問題比較大!因此這裏得要注意這個項目耗用 CPU 的資源! 另外,如果是多核心的設備,可以按下數字鍵『1』來切換成不同 CPU 的負載率。

第四行與第五行:表示目前的實體內存與虛擬內存 (Mem/Swap) 的使用情況。 再次重申,要注意的是 swap 的使用量要儘量的少!如果 swap 被用的很大量,表示系統的實體內存實在不足!

第六行:這個是當在 top 程序當中輸入命令時,顯示狀態的地方。 

top 下半部分的畫面,則是每個 process 使用的資源情況。比較需要注意的是:

PID :每個 process 的 ID 啦! 

USER:該 process 所屬的使用者; 

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

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

%CPUCPU 的使用率; 

%MEM:內存的使用率; 

TIME+CPU 使用時間的累加; 

top 默認使用 CPU 使用率 (%CPU) 作爲排序的重點,如果你想要使用內存使用率排序,則可以按下『M』, 若要回復則按下『P』即可。如果想要離開 top 則按下『 』吧!如果你想要將 top 的結果輸出成爲文件時, 可以這樣做:

範例二:將 top 的刷新進行 次,然後將結果輸出到 /tmp/top.txt

[root@instructor Desktop]# top -b -n 2 > /tmp/top.txt

我們可以僅觀察單一程序!如下所示:

範例三:我們自己的 bash PID 可由 $$ 變量取得,請使用 top 持續觀察該 PID

[root@instructor Desktop]# echo $$

13639  <==就是這個數字!他就當前 bash 的 PID

[root@instructor Desktop]# top -d 2 -p 13639

top - 17:31:56 up 7 days, 16:45,  1 user,  load average: 0.00, 0.00, 0.00

Tasks:   1 total,   0 running,   1 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

Mem:    742664k total,   682540k used,    60124k free,   126548k buffers

Swap:  1020088k total,       28k used,  1020060k free,   311276k cached

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

13639 root      15   0  5148 1508 1220 S  0.0  0.2   0:00.18 bash

 

修改 NI 數值,可以這樣做:

範例四:承上題,上面的 NI 值是 ,想要改成 10 的話?

在範例三的 top 畫面當中直接按下 之後,會出現如下的圖樣!

top - 17:34:24 up 7 days, 16:47,  1 user,  load average: 0.00, 0.00, 0.00

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

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

Mem:    742664k total,   682540k used,    60124k free,   126636k buffers

Swap:  1020088k total,       28k used,  1020060k free,   311276k cached

PID to renice: 13639  <==按下 然後輸入這個 PID 號碼

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

13639 root      15   0  5148 1508 1220 S  0.0  0.2   0:00.18 bash

 

在你完成上面的動作後,在狀態列會出現如下的資訊:

Renice PID 13639 to value: 10   <==這是 nice 

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

 

接下來你就會看到如下的顯示畫面!

top - 17:38:58 up 7 days, 16:52,  1 user,  load average: 0.00, 0.00, 0.00

Tasks:   1 total,   0 running,   1 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

Mem:    742664k total,   682540k used,    60124k free,   126648k buffers

Swap:  1020088k total,       28k used,  1020060k free,   311276k cached

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

13639 root      26  10  5148 1508 1220 S  0.0  0.2   0:00.18 bash

四、Killkillall

程序之間是可以互相控制的!舉例來說,你可以關閉、重新啓動服務器軟件,服務器軟件本身是個程序, 你既然可以讓她關閉或啓動,當然就是可以控制該程序!那麼程序是如何互相管理的呢?其實是透過給予該程序一個訊號 (signal) 去告知該程序你想要讓它作什麼!

主要的訊號代號與名稱對應及內容是:

代號

名稱

內容

1

SIGHUP

啓動被終止的程序,可讓該 PID 重新讀取自己的配置檔,類似重新啓動

2

SIGINT

相當於用鍵盤輸入 [ctrl]-c 來中斷一個程序的進行

9

SIGKILL

代表強制中斷一個程序的進行,如果該程序進行到一半, 那麼尚未完成的部分可能會有『半產品』產生,類似 vim會有 .filename.swp 保留下來。

15

SIGTERM

以正常的結束程序來終止該程序。由於是正常的終止, 所以後續的動作會將他完成。不過,如果該程序已經發生問題,就是無法使用正常的方法終止時, 輸入這個 signal 也是沒有用的。

17

SIGSTOP

相當於用鍵盤輸入 [ctrl]-z 來暫停一個程序的進行

1、Kill

kill [-s sigspec | -n signum | -sigspec] pid | jobspec … or kill -l [sigspec]

  說明:kill 送出一個特定的信號 (signal) 給行程 id 爲 pid 的行程根據該信號而做特定的動作,若沒有指定,預設是送出終止 (TERM) 的信號

  -s (signal) : 其中常用的訊號有 HUP (1),KILL (9),TERM (15),分別代表着重跑,砍掉,結束詳細的信號可以用 kill -l (見下結果,可用數字帶入)

  -p : 印出 pid,並不送出信號

  -l (signal) : 列出所有可用的信號名稱

  這個就是kill -l的查詢結果:

  1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL

  5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE

  9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2

  13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT

  17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP

  21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU

  25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH

  29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN

  35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4

  39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8

  43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12

  47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14

  51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10

  55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6

  59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2

  63) SIGRTMAX-1 64) SIGRTMAX

  一般範例:

  將 pid 爲 323 的線程砍掉 (kill) :

  kill -9 323

  將 pid 爲 456 的線程重跑 (restart) :

  kill -HUP 456

  一般來講,查詢PID的命令是

  ps -ef | grep yum(表示查詢的是yumPID,根據查詢的東西不同而異)。

  舉一個實際的例子:

  比方說,fedora的在線更新命令yum鎖鎖住了,常見的提示是

  Existing lock /var/run/yum.pid: another copy is running as pid 19698.

  Another app is currently holding the yum lock; waiting for it to exit

  Another app is currently holding the yum lock; waiting for it to exit

  Another app is currently holding the yum lock; waiting for it to exit

  Another app is currently holding the yum lock; waiting for it to exit

  Another app is currently holding the yum lock; waiting for it to exit

  …….

  這裏就沒必要使用ps命令了,因爲已經知道PID就是19698這個值了,因此不用在查詢。

  這時就要使用kill19698的進程殺死。其中的19698就是PID

  所以在命令行內輸入:

  kill -9 19698

  就能成功的殺死這個進程。

  kill的改進用法如下:

  (1)把ps的查詢結果通過管道給grep查找包含特定字符串的進程。管道符“|”用來隔開兩個命令,管道符左邊命令的輸出會作爲管道符右邊命令的輸入。

  $ ps -ef | grep firefox

  smx 1827 1 4 11:38 ? 00:27:33 /usr/lib/firefox-3.6.18/firefox-bin

  smx 12029 1824 0 21:54 pts/0 00:00:00 grep color=auto firefox

  這次就清爽了。然後就是

  $kill -s 9 1827

  還是嫌打字多?

  (2)使用pgrep

  一看到pgrep首先會想到什麼?沒錯,greppgrepp表明了這個命令是專門用於進程查詢的grep

  $ pgrep firefox

  1827

  看到了什麼?沒錯火狐的PID,接下來又要打字了:

  $kill -s 9 1827

2、Killall

[root@instructor Desktop]# killall [-ire] [command name]

參數:

-i : interactive 的意思,交互式的,若需要刪除時,會出現提示符給用戶;

-eexact 的意思,表示後面接的command name要一致,但整個完整的命令不能超過15個字符。

-l:命令名稱(可能含參數)忽略大小寫。

範例一:給予syslogd這個命令啓動的PID一個SIGHUP的信號

[root@instructor Desktop]# killall -l syslogd

範例二:強制終止所有以httpd啓動的進程

[root@instructor Desktop]# killall -9 httpd

範例三:依次詢問每個bash進程是否需要被終止運行

[root@instructor Desktop]# killall -i -9 bash

Kill bash(16905)?y/n) n <==不殺死

Kill bash(17351)?(y/n)y ,<==殺死

具有互動的功能,可以詢問你是否要刪除bash這個進程。若沒有-i的參數,所有的bash都會被這個root給殺掉!包括root自己的bash


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章