2011年2月9日 星期三

[Linux 小學堂] Linux 程序管理 ( ps -l / ps aux / ps axjf )

前言 : 
為什麼程序管理這麼重要呢?這是因為: 

* 首先,本章一開始就談到的,我們在操作系統時的各項工作其實都是經過某個 PID 來達成的 (包括你的 bash 環境), 因此,能不能進行某項工作,就與該程序的權限有關了。
* 再來,如果您的 Linux 系統是個很忙碌的系統,那麼當整個系統資源快要被使用光時, 您是否能夠找出最耗系統的那個程序,然後刪除該程序,讓系統恢復正常呢?
* 此外,如果由於某個程式寫的不好,導致產生一個有問題的程序在記憶體當中,您又該如何找出他,然後將他移除呢?
* 如果同時有五六項工作在您的系統當中運作,但其中有一項工作才是最重要的, 該如何讓那一項重要的工作被最優先執行呢?

所以囉,一個稱職的系統管理員,必須要熟悉程序的管理流程才行,否則當系統發生問題時,還真是很難解決問題呢! 底下我們會先介紹如何觀察程序與程序的狀態,然後再加以程序控制囉. 

程序的觀察 
既然程序這麼重要,那麼我們如何查閱系統上面正在運作當中的程序呢?很簡單啊! 利用靜態的 ps 或者是動態的 top,還能以 pstree 來查閱程序樹之間的關係喔! 
ps :將某個時間點的程序運作情況擷取下來
[root@www ~]# ps aux <==觀察系統所有的程序資料 
[root@www ~]# ps -lA <==也是能夠觀察所有系統的資料
[root@www ~]# ps axjf <==連同部分程序樹狀態
選項與參數:
-A :所有的 process 均顯示出來,與 -e 具有同樣的效用;
-a :不與 terminal 有關的所有 process ;
-u :有效使用者 (effective user) 相關的 process ;
x :通常與 a 這個參數一起使用,可列出較完整資訊。
輸出格式規劃:
l :較長、較詳細的將該 PID 的的資訊列出;
j :工作的格式 (jobs format)
-f :做一個更為完整的輸出。

Ps. ps 這個指令的 man page 不是很好查閱,因為很多不同的 Unix 都使用這個 ps 來查閱程序狀態, 
為了要符合不同版本的需求,所以這個 man page 寫的非常的龐大!因此,建議你直接背兩個比較 
不同的選項,一個是只能查閱自己 bash 程序的『 ps -l 』一個則是可以查閱所有系統運作的程序
『 ps aux 』
 

範例一:將目前屬於您自己這次登入的 PID 與相關資訊列示出來(只與自己的 bash 有關) 
tw-johnklee4:~ # ps -l <僅觀察自己的 bash 相關程序: ps -l> 
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 
4 S 0 14999 14997 0 75 0 - 1036 wait pts/1 00:00:00 bash 
0 R 0 15046 14999 1 77 0 - 545 - pts/1 00:00:00 ps 

果使用 ps -l 則僅列出與你的操作環境 (bash) 有關的程序而已 
亦即最上層的父程序會是你自己的 bash 而沒有延伸到 init 這支程序去!那麼 ps -l 秀出來的資料 
有哪些呢?我們就來觀察看看:
* F:代表這個程序旗標 (process flags),說明這個程序的總結權限,常見號碼有:
o 若為 4 表示此程序的權限為 root ;
o 若為 1 則表示此子程序僅進行複製(fork)而沒有實際執行(exec)。

* S:代表這個程序的狀態 (STAT),主要的狀態有:
o R (Running):該程式正在運作中;
o S (Sleep):開程式目前正在睡眠狀態(idle),但可以被喚醒(signal)。
o D :不可被喚醒的睡眠狀態,通常這支程式可能在等待 I/O 的情況(ex>列印)
o T :停止狀態(stop),可能是在工作控制(背景暫停)或除錯 (traced) 狀態;
o Z (Zombie):僵屍狀態,程序已經終止但卻無法被移除至記憶體外。

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

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

* PRI/NI:Priority/Nice 的縮寫,代表此程序被 CPU 所執行的優先順序,數值越小代表該程序越快被 CPU 執行。詳細的 PRI 與 NI 將在下一小節說明。

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

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

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

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



範例二:列出目前所有的正在記憶體當中的程序: 
tw-johnklee4:~ # ps aux <觀察系統所有程序: ps aux> 
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND 
root 1 0.0 0.0 716 284 ? S 07:51 0:00 init [5] 
root 2 0.0 0.0 0 0 ? SN 07:51 0:00 [ksoftirqd/0] 
root 3 0.0 0.0 0 0 ? S< 07:51 0:00 [events/0] 
...(省略) 
postfix 14919 0.0 0.3 5376 1640 ? S 19:04 0:00 pickup -l -t fi 
root 14997 0.0 0.4 8516 2568 ? Ss 19:28 0:00 sshd: root@pts/ 
root 14999 0.0 0.3 4144 1912 pts/1 Ss 19:29 0:00 -bash 
root 15048 0.0 0.1 2388 844 pts/1 R+ 19:39 0:00 ps aux 

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 的 S 旗標相同 (R/S/T/Z)
* START:該 process 被觸發啟動的時間;
* TIME :該 process 實際使用 CPU 運作的時間。
* COMMAND:該程序的實際指令為何?


範例三:找出與 cron 與 syslog 這兩個服務有關的 PID 號碼 
tw-johnklee4:~ # ps aux | egrep '(cron|syslog)' 
root 2054 0.0 0.1 1896 800 ? Ss 07:51 0:00 /sbin/syslog-ng 
root 3830 0.0 0.1 1824 544 ? Ss 07:52 0:00 /usr/sbin/cron 
# 所以號碼是 2054 及 3830 這兩個囉!就是這樣找的啦! 

沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...