1. 程式人生 > >鳥哥的Linux私房菜讀書筆記--程序管理

鳥哥的Linux私房菜讀書筆記--程序管理

1、程序的觀察

<1>ps:將某個時間點的程序運作情況 擷取下來

[[email protected] ~]# ps aux <==觀察系統所有的程序資料,注意前面沒有-號。 [[email protected] ~]# ps -lA <==也是能夠觀察所有系統的資料 [[email protected] ~]# ps axjf <==連同部分程序樹狀態 選項與引數: -A :所有的 process 均顯示出來,與 -e 具有同樣的效用; -a :不與 terminal 有關的所有 process ; -u :有效使用者 (effective user) 相關的 process ; x :通常與 a 這個引數一起使用,可列出較完整資訊。 輸出格式規劃: l :較長、較詳細的將該 PID 的的資訊列出; j :工作的格式 (jobs format) -f :做一個更為完整的輸出。

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

§ F:代表這個程序旗標 (process flags),說明這個程序的總結許可權,常見號碼有:         § 若為 4 表示此程序的許可權為 root ;         § 若為 1 則表示此子程序僅進行復制(fork)而沒有實際執行(exec)。 § 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 執行。詳細的 PRI 與                       NI將在下一小節說明。 § ADDR/SZ/WCHAN:都與記憶體有關,ADDR 是 kernel function,指出該程序在記憶體的哪個部分,如果是個running 的程序,一                                       般就會顯示『 - 』 / SZ 代表此程序用掉多少記憶體 / WCHAN 表示目前程序是否運作中,同樣的, 若為 -                                         表示正在運作中。 § TTY:登入者的終端機位置,若為遠端登入則使用動態終端介面 (pts/n); § TIME:使用掉的 CPU 時間,注意,是此程序實際花費 CPU 運作的時間,而不是系統時間; § CMD:就是 command 的縮寫,造成此程序的觸發程式之指令為何。 所以你看到的 ps -l 輸出訊息中,他說明的是:『bash 的程式屬於 UID 為 0 的使用者,狀態為睡眠 (sleep), 之所以為睡眠因為他觸發了 ps (狀態為 run) 之故。此程序的 PID 為 14836,優先執行順序為 80 , 下達 bash 所取得的終端介面為 pts/0 ,運作狀態為等待 (wait) 。』

(2)觀察系統所有程序: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:該程序的實際指令為何?

殭屍程序:程序應該已經執行完畢,或者因故應該要終止了,但該程序的父程序無法完整的將該程序結束掉,造成該程序一直在記憶體中,如果某程序的後面還接有<defunct>就表示其為殭屍程序

<2>top:動態觀察程序的變化

[email protected] ~]# top [-d 數字] | top [-bnp] 選項與引數: -d :後面可以接秒數,就是整個程序畫面更新的秒數。預設是 5 秒; -b :以批次的方式執行 top ,還有更多的引數可以使用喔!通常會搭配資料流重導向來將批次的結果輸出成為檔案。 -n :與 -b 搭配,意義是,需要進行幾次 top 的輸出結果。 -p :指定某些個 PID 來進行觀察監測而已。 在 top 執行過程當中可以使用的按鍵指令: ? :顯示在 top 當中可以輸入的按鍵指令; P :以 CPU 的使用資源排序顯示; M :以 Memory 的使用資源排序顯示; N :以 PID 來排序喔! T :由該 Process 使用的 CPU 時間累積 (TIME+) 排序。 k :給予某個 PID 一個訊號 (signal) r :給予某個 PID 重新制訂一個 nice 值。 q :離開 top 軟體的按鍵。

· 第一行(top...):這一行顯示的資訊分別為:                           o 目前的時間,亦即是 00:53:59 那個專案;                           o 開機到目前為止所經過的時間,亦即是 up 6:07, 那個專案;                           o 已經登入系統的使用者人數,亦即是 3 users, 專案;                           o 系統在 1, 5, 15 分鐘的平均工作負載。我們在第十五章談到的 batch 工作方式為負載小於 0.8 就是這個負載                                   囉!代表的是 1, 5, 15 分鐘,系統平均要負責運作幾個程序(工作)的意思。 越小代表系統越閒置,若高於 1 得                               要注意你的系統程序是否太過繁複了! · 第二行(Tasks...):顯示的是目前程序的總量與個別程序在什麼狀態(running, sleeping, stopped, zombie)。 比較需要注意的是最                                 後的 zombie 那個數值,如果不是 0 !好好看看到底是那個 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 有關,也是越小越早被執行; · %CPU:CPU 的使用率; · %MEM:記憶體的使用率; · TIME+:CPU 使用時間的累加;

範例三:我們自己的 bash PID 可由 $$ 變數取得,請使用 top 持續觀察該 PID [[email protected] ~]# echo $$ 14836 <==就是這個數字!他是我們 bash 的 PID [[email protected] ~]# top -d 2 -p 14836

<3>pstree    #檢視各程序間的相關性

選項與引數: -A :各程序樹之間的連線以 ASCII 字元來連線; -U :各程序樹之間的連線以萬國碼的字元來連線。在某些終端介面下可能會有錯誤; -p :並同時列出每個 process 的 PID; -u :並同時列出每個 process 的所屬賬號名稱。

2、程序的管理

代號 名稱 內容
1 SIGHUP 啟動被終止的程序,可讓該 PID 重新讀取自己的配置檔案,類似重新啟動
2 SIGINT 相當於用鍵盤輸入 [ctrl]-c 來中斷一個程序的進行
9 SIGKILL 代表強制中斷一個程序的進行,如果該程序進行到一半, 那麼尚未完成的部分可能會有『半產品』產生,類似 vim 會有 .filename.swp 保留下來。
15 SIGTERM 以正常的結束程序來終止該程序。由於是正常的終止, 所以後續的動作會將他完成。不過,如果該程序已經發生問題,就是無法使用正常的方法終止時, 輸入這個 signal 也是沒有用的。
19 SIGSTOP 相當於用鍵盤輸入 [ctrl]-z 來暫停一個程序的進行

<1>kill -singal PID

kill可以將signal傳送給某個工作(%/numberr)或者某個PID。kill後面直接加數字與加上%+數字的情況是不一樣的,%是專門用於工作控制的

<2>killall -sinagal  指令名稱

[[email protected] ~]# killall [-iIe] [command name] 選項與引數: -i :interactive 的意思,互動式的,若需要刪除時,會出現提示字元給使用者; -e :exact 的意思,表示『後面接的 command name 要一致』,但整個完整的指令不能超過 15 個字元。 -I :指令名稱(可能含引數)忽略大小寫。 範例一:給予 rsyslogd 這個指令啟動的 PID 一個 SIGHUP 的訊號 [[email protected] ~]# killall -1 rsyslogd # 如果用 ps aux 仔細看一下,若包含所有引數,則 /usr/sbin/rsyslogd -n 才是最完整的! 範例二:強制終止所有以 httpd 啟動的程序 (其實並沒有此程序在系統內) [[email protected] ~]# killall -9 httpd

3、關於程序的執行順序

<1>priority與nice值

優先執行順序(priority,PRI),PRI值越小越優先,PRI值是由核心動態調整的,使用者無法直接調整PRI值,如果想要調整程序的優先執行順序,就需要透過nice值進行調整,即NI值。

PRI(new)=PRI(old)+nice 注意:· nice 值可調整的範圍為 -20 ~ 19 ; · root 可隨意調整自己或他人程序的 Nice 值,且範圍為 -20 ~ 19 ; · 一般使用者僅可調整自己程序的 Nice 值,且範圍僅為 0 ~ 19 (避免一般使用者搶佔系統資源); · 一般使用者僅可將 nice 值越調越高,例如本來 nice 為 5 ,則未來僅能調整到大於 5; 給予一個程序nice值的方法: · 一開始執行程式就立即給予一個特定的 nice 值:用 nice 指令; · 調整某個已經存在的 PID 的 nice 值:用 renice 指令。

<2>nice:新執行的指令即給予新的nice值

[[email protected] ~]# nice [-n 數字] command 選項與引數:    -n :後面接一個數值,數值的範圍 -20 ~ 19

<3>renice :已存在程序的 nice 重新調整 [[email protected] ~]# renice [number] PID 選項與引數:  PID :某個程序的 ID 啊!

4、系統資源的觀察

<1>free:觀察記憶體使用情況

[[email protected] ~]# free [-b|-k|-m|-g|-h] [-t] [-s N -c N] 選項與引數: -b :直接輸入 free 時,顯示的單位是 Kbytes,我們可以使用 b(bytes), m(Mbytes)  k(Kbytes), 及 g(Gbytes) 來顯示單位喔!也可以直接讓系統自己指定單位 (-h) -t :在輸出的最終結果,顯示實體記憶體與 swap 的總量。 -s :可以讓系統每幾秒鐘輸出一次,不間斷的一直輸出的意思!對於系統觀察挺有效! -c :與 -s 同時處理~讓 free 列出幾次的意思~

<2>uname:查閱系統與核心相關資訊

[[email protected] ~]# uname [-asrmpi] 選項與引數: -a :所有系統相關的資訊,包括底下的資料都會被列出來; -s :系統核心名稱 -r :核心的版本 -m :本系統的硬體名稱,例如 i686 或 x86_64 等; -p :CPU 的型別,與 -m 類似,只是顯示的是 CPU 的型別! -i :硬體的平臺 (ix86)

<3>uptime:觀察系統啟動時間與工作負載

命令:  $  uptiem

<4>netstat:追蹤網路與插槽檔案    #用於網路的監控方面

[[email protected] ~]# netstat -[atunlp] 選項與引數: -a :將目前系統上所有的聯機、監聽、Socket 資料都列出來 -t :列出 tcp 網路封包的資料 -u :列出 udp 網路封包的資料 -n :不以程序的服務名稱,以埠號 (port number) 來顯示; -l :列出目前正在網路監聽 (listen) 的服務; -p :列出該網路服務的程序 PID

· Proto :網路的封包協議,主要分為 TCP 與 UDP 封包,相關資料請參考伺服器篇; · Recv-Q:非由使用者程式連結到此 socket 的複製的總 bytes 數; · Send-Q:非由遠端主機傳送過來的 acknowledged 總 bytes 數; · Local Address :本地端的 IP:port 情況 · Foreign Address:遠端主機的 IP:port 情況 · State :聯機狀態,主要有建立(ESTABLISED)及監聽(LISTEN);

對於插槽檔(socket file)檔案的輸出欄位有:

· Proto :一般就是 unix 啦; · RefCnt:連線到此 socket 的程序數量; · Flags :聯機的旗標; · Type :socket 存取的型別。主要有確認聯機的 STREAM 與不需確認的 DGRAM 兩種; · State :若為 CONNECTED 表示多個程序之間已經聯機建立。 · Path :連線到此 socket 的相關程式的路徑!或者是相關資料輸出的路徑。

<5>dmesg:分析核心產生的訊息

命令:$  demsg | more    #輸出所有的核心開機時的資訊

命令:$  demsg | grep -i vda    #搜尋開機時硬碟的相關資訊

<6>vmstat:偵測系統資源變化

[[email protected] ~]# vmstat [-a] [延遲 [總計偵測次數]] <==CPU/記憶體等資訊 [[email protected] ~]# vmstat [-fs] <==記憶體相關 [[email protected] ~]# vmstat [-S 單位] <==設定顯示資料的單位 [[email protected] ~]# vmstat [-d] <==與磁碟有關 [[email protected] ~]# vmstat [-p 分割槽槽] <==與磁碟有關 選項與引數: -a :使用 inactive/active(活躍與否) 取代 buffer/cache 的記憶體輸出資訊; -f :開機到目前為止,系統複製 (fork) 的程序數; -s :將一些事件 (開機至目前為止) 導致的記憶體變化情況列表說明; -S :後面可以接單位,讓顯示的資料有單位。例如 K/M 取代 bytes 的容量; -d :列出磁碟的讀寫總量統計表 -p :後面列出分割槽槽,可顯示該分割槽槽的讀寫總量統計表

· 程序欄位 (procs) 的專案分別為: r :等待運作中的程序數量;b:不可被喚醒的程序數量。這兩個專案越多,代表系統越忙碌 (因為系統太忙,所以很多程序就無法被執行或一直在等待而無法被喚醒之故)。 · 記憶體欄位 (memory) 專案分別為: swpd:虛擬記憶體被使用的容量; free:未被使用的記憶體容量; buff:用於緩衝儲存器; cache:用於快取記憶體。 這部份則與 free 是相同的。 · 記憶體置換空間 (swap) 的專案分別為: si:由磁碟中將程序取出的量;so:由於記憶體不足而將沒用到的程序寫入到磁碟的 swap 的容量。如果 si/so 的數值太大,表示記憶體內的資料常常得在磁碟與主儲存器之間傳來傳去,系統效能會很差! · 磁碟讀寫 (io) 的專案分別為: bi:由磁碟讀入的區塊數量; bo:寫入到磁碟去的區塊數量。如果這部份的值越高,代表系統的 I/O 非常忙碌! · 系統 (system) 的專案分別為: in:每秒被中斷的程序次數; cs:每秒鐘進行的事件切換次數;這兩個數值越大,代表系統與介面裝置的溝通非常頻繁! 這些介面裝置當然包括磁碟、網路卡、時間鍾等。 · CPU 的專案分別為: us:非核心層的 CPU 使用狀態; sy:核心層所使用的 CPU 狀態; id:閒置的狀態; wa:等待 I/O 所耗費的 CPU 狀態; st:被虛擬機器 (virtual machine) 所盜用的 CPU 使用狀態 (2.6.11 以後才支援)。