Linux作業系統程式管理的分析與應用

gswwgph發表於2007-01-20

目錄

1、程式和程式;
1.1 程式分類;
1.2 程式的屬性;
1.3 父程式和子程式;

2、程式管理;
2.1 ps 監視程式工具;
2.1.1 ps引數說明;
2.1.2 ps 應用舉例;
2.2 pgrep

3、終止程式的工具 kill 、killall、pkill、xkill;
3.1 kill
3.2 killall
3.3 pkill
3.4 xkill

4、top 監視系統任務的工具;
4.1 top 命令用法及引數;
4.2 top 應用舉例;

5、程式的優先順序: nice和renice;
6、關於本文;
7、後記;
8、參考文件;
9、相關文件;

[@more@]

  1、程式和程式;

  程式是為了完成某種任務而設計的軟體,比如OpenOffice是程式。什麼是程式呢?程式就是執行中的程式。

  一個執行著的程式,可能有多個程式。比如 LinuxSir.Org 所用的WWW伺服器是apache伺服器,當管理員啟動服務後,可能會有好多人來訪問,也就是說許多使用者來同時請求httpd服務,apache伺服器將會建立有多個httpd程式來對其進行服務。

  1.1 程式分類;

  程式一般分為互動程式、批處理程式和守護程式三類。

  值得一提的是守護程式總是活躍的,一般是後臺執行,守護程式一般是由系統在開機時透過指令碼自動啟用啟動或超級管理使用者root來啟動。比如在Fedora或Redhat中,我們可以定義httpd 伺服器的啟動指令碼的執行級別,此檔案位於/etc/init.d目錄下,檔名是httpd,/etc/init.d/httpd 就是httpd伺服器的守護程式,當把它的執行級別設定為3和5時,當系統啟動時,它會跟著啟動。

  [root@localhost ~]# chkconfig --level 35 httpd on

  由於守護程式是一直執行著的,所以它所處的狀態是等待請求處理任務。比如,我們是不是訪問 LinuxSir.Org ,LinuxSir.Org 的httpd伺服器都在執行,等待著使用者來訪問,也就是等待著任務處理。

1.2 程式的屬性;

  程式ID(PID):是唯一的數值,用來區分程式;  父程式和父程式的ID(PPID);
  啟動程式的使用者ID(UID)和所歸屬的組(GID);
  程式狀態:狀態分為執行R、休眠S、殭屍Z;
  程式執行的優先順序;
  程式所連線的終端名;
  程式資源佔用:比如佔用資源大小(記憶體、CPU佔用量);

  1.3 父程式和子程式;

  他們的關係是管理和被管理的關係,當父程式終止時,子程式也隨之而終止。但子程式終止,父程式並不一定終止。比如httpd伺服器執行時,我們可以殺掉其子程式,父程式並不會因為子程式的終止而終止。

  在程式管理中,當我們發現佔用資源過多,或無法控制的程式時,應該殺死它,以保護系統的穩定安全執行;

  2、程式管理;

  對於Linux程式的管理,是透過程式管理工具實現的,比如ps、kill、pgrep等工具;

  2.1 ps 監視程式工具;

  ps 為我們提供了程式的一次性的檢視,它所提供的檢視結果並不動態連續的;如果想對程式時間監控,應該用top工具;

  2.1.1 ps 的引數說明;

  ps 提供了很多的選項引數,常用的有以下幾個;
  l 長格式輸出;
  u 按使用者名稱和啟動時間的順序來顯示程式;
  j 用任務格式來顯示程式;
  f 用樹形格式來顯示程式;
  a 顯示所有使用者的所有程式(包括其它使用者);
  x 顯示無控制終端的程式;
  r 顯示執行中的程式;
  ww 避免詳細引數被截斷;

  我們常用的選項是組合是aux 或lax,還有引數f的應用;

  ps aux 或lax輸出的解釋;

USER 程式的屬主;

PID 程式的ID;

PPID 父程式;

%CPU 程式佔用的CPU百分比;

%MEM 佔用記憶體的百分比;

NI 程式的NICE值,數值大,表示較少佔用CPU時間;

VSZ 程式虛擬大小;

RSS 駐留中頁的數量;

WCHAN

TTY 終端ID

STAT 程式狀態

D Uninterruptible sleep (usually IO)

R 正在執行可中在佇列中可過行的;

S 處於休眠狀態;

T 停止或被追蹤;

W 進入記憶體交換(從核心2.6開始無效);

X 死掉的程式(從來沒見過);

Z 殭屍程式;

< 優先順序高的程式

N 優先順序較低的程式

L 有些頁被鎖進記憶體;

s 程式的領導者(在它之下有子程式);

l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)

+ 位於後臺的程式組;

WCHAN 正在等待的程式資源;

START 啟動程式的時間;

TIME 程式消耗CPU的時間;

COMMAND 命令的名稱和引數;

  2.1.2 ps 應用舉例;

  例項一:ps aux 最常用

  [root@localhost ~]# ps -aux |more

  可以用 | 管道和 more 連線起來分頁檢視;

  [root@localhost ~]# ps -aux > ps001.txt  [root@localhost ~]# more ps001.txt

  這裡是把所有程式顯示出來,並輸出到ps001.txt檔案,然後再透過more 來分頁檢視;

  例項二:和grep 結合,提取指定程式的程式;

  [root@localhost ~]# ps aux |grep httpd
  root 4187 0.0 1.3 24236 10272 ? Ss 11:55 0:00 /usr/sbin/httpd
  apache 4189 0.0 0.6 24368 4940 ? S 11:55 0:00 /usr/sbin/httpd
  apache 4190 0.0 0.6 24368 4932 ? S 11:55 0:00 /usr/sbin/httpd
  apache 4191 0.0 0.6 24368 4932 ? S 11:55 0:00 /usr/sbin/httpd
  apache 4192 0.0 0.6 24368 4932 ? S 11:55 0:00 /usr/sbin/httpd
  apache 4193 0.0 0.6 24368 4932 ? S 11:55 0:00 /usr/sbin/httpd
  apache 4194 0.0 0.6 24368 4932 ? S 11:55 0:00 /usr/sbin/httpd
  apache 4195 0.0 0.6 24368 4932 ? S 11:55 0:00 /usr/sbin/httpd
  apache 4196 0.0 0.6 24368 4932 ? S 11:55 0:00 /usr/sbin/httpd
  root 4480 0.0 0.0 5160 708 pts/3 R+ 12:20 0:00 grep httpd

  例項二:父進和子程式的關係友好判斷的例子

  

[root@localhost ~]# ps auxf |grep httpd
  root 4484 0.0 0.0 5160 704 pts/3 S+ 12:21 0:00 _ grep httpd
  root 4187 0.0 1.3 24236 10272 ? Ss 11:55 0:00 /usr/sbin/httpd
  apache 4189 0.0 0.6 24368 4940 ? S 11:55 0:00 _ /usr/sbin/httpd
  apache 4190 0.0 0.6 24368 4932 ? S 11:55 0:00 _ /usr/sbin/httpd
  apache 4191 0.0 0.6 24368 4932 ? S 11:55 0:00 _ /usr/sbin/httpd
  apache 4192 0.0 0.6 24368 4932 ? S 11:55 0:00 _ /usr/sbin/httpd
  apache 4193 0.0 0.6 24368 4932 ? S 11:55 0:00 _ /usr/sbin/httpd
  apache 4194 0.0 0.6 24368 4932 ? S 11:55 0:00 _ /usr/sbin/httpd
  apache 4195 0.0 0.6 24368 4932 ? S 11:55 0:00 _ /usr/sbin/httpd
  apache 4196 0.0 0.6 24368 4932 ? S 11:55 0:00 _ /usr/sbin/httpd

  這裡用到了f引數;父與子關係一目瞭然;

2.2 pgrep

  pgrep 是透過程式的名字來查詢程式的工具,一般是用來判斷程式是否正在執行。在伺服器的配置和管理中,這個工具常被應用,簡單明瞭;

  用法:

  #ps 引數選項 程式名

  常用引數

  -l 列出程式名和程式ID;  -o 程式起始的ID;  -n 程式終止的ID;

  舉例:

[root@localhost ~]# pgrep -lo httpd
4557 httpd
[root@localhost ~]# pgrep -ln httpd
4566 httpd
[root@localhost ~]# pgrep -l httpd
4557 httpd
4560 httpd
4561 httpd
4562 httpd
4563 httpd
4564 httpd
4565 httpd
4566 httpd
[root@localhost ~]# pgrep httpd
4557
4560
4561
4562
4563
4564
4565
4566

  3、終止程式的工具 kill 、killall、pkill、xkill;

  終止一個程式或終止一個正在執行的程式,一般是透過 kill 、killall、pkill、xkill 等進行。比如一個程式已經死掉,但又不能退出,這時就應該考慮應用這些工具。

  另外應用的場合就是在伺服器管理中,在不涉及資料庫伺服器程式的父程式的停止執行,也可以用這些工具來終止。為什麼資料庫伺服器的父程式不能用這些工具殺死呢?原因很簡單,這些工具在強行終止資料庫伺服器時,會讓資料庫產生更多的檔案碎片,當碎片達到一定程度的時候,資料庫就有崩潰的危險。比如mysql伺服器最好是按其正常的程式關閉,而不是用pkill mysqld 或killall mysqld 這樣危險的動作;當然對於佔用資源過多的資料庫子程式,我們應該用kill 來殺掉。

3.1 kill

  kill的應用是和ps 或pgrep 命令結合在一起使用的;

  kill 的用法:

  kill [訊號程式碼] 程式ID

  注:訊號程式碼可以省略;我們常用的訊號程式碼是 -9 ,表示強制終止;

  舉例:

[root@localhost ~]# ps auxf |grep httpd
root 4939 0.0 0.0 5160 708 pts/3 S+ 13:10 0:00 _ grep httpd
root 4830 0.1 1.3 24232 10272 ? Ss 13:02 0:00 /usr/sbin/httpd
apache 4833 0.0 0.6 24364 4932 ? S 13:02 0:00 _ /usr/sbin/httpd
apache 4834 0.0 0.6 24364 4928 ? S 13:02 0:00 _ /usr/sbin/httpd
apache 4835 0.0 0.6 24364 4928 ? S 13:02 0:00 _ /usr/sbin/httpd
apache 4836 0.0 0.6 24364 4928 ? S 13:02 0:00 _ /usr/sbin/httpd
apache 4837 0.0 0.6 24364 4928 ? S 13:02 0:00 _ /usr/sbin/httpd
apache 4838 0.0 0.6 24364 4928 ? S 13:02 0:00 _ /usr/sbin/httpd
apache 4839 0.0 0.6 24364 4928 ? S 13:02 0:00 _ /usr/sbin/httpd
apache 4840 0.0 0.6 24364 4928 ? S 13:02 0:00 _ /usr/sbin/httpd

  我們檢視httpd 伺服器的程式;您也可以用pgrep -l httpd 來檢視;

  我們看上面例子中的第二列,就是程式PID的列,其中4830是httpd伺服器的父程式,從4833-4840的程式都是它4830的子程式;如果我們殺掉父程式4830的話,其下的子程式也會跟著死掉;

  [root@localhost ~]# kill 4840 注:殺掉4840這個程式;  [root@localhost ~]# ps -auxf |grep httpd 注:檢視一下會有什麼結果?是不是httpd伺服器仍在執行?  [root@localhost ~]# kill 4830 注:殺掉httpd的父程式;  [root@localhost ~]# ps -aux |grep httpd 注:檢視httpd的其它子程式是否存在,httpd伺服器是否仍在執行?

  對於殭屍程式,可以用kill -9 來強制終止退出;

  比如一個程式已經徹底死掉,如果kill 不加訊號強度是沒有辦法退出,最好的辦法就是加訊號強度 -9 ,後面要接殺父程式;比如;

[root@localhost ~]# ps aux |grep gaim
beinan 5031 9.0 2.3 104996 17484 ? S 13:23 0:01 gaim
root 5036 0.0 0.0 5160 724 pts/3 S+ 13:24 0:00 grep gaim

[root@localhost ~]# pgrep -l gaim
5031 gaim
[root@localhost ~]# kill -9 5031

3.2 killall

  killall 透過程式的名字,直接殺死所有程式,我們們簡單說一下就行了。

  用法:killall 正在執行的程式名

  killall 也和ps或pgrep 結合使用,比較方便;透過ps或pgrep 來檢視哪些程式在執行;

  舉例:

[root@localhost beinan]# pgrep -l gaim
2979 gaim
[root@localhost beinan]# killall gaim

  3.3 pkill

  pkill 和killall 應用方法差不多,也是直接殺死執行中的程式;如果您想殺掉單個程式,請用kill 來殺掉。

  應用方法:

  #pkill 正在執行的程式名

  舉例:

[root@localhost beinan]# pgrep -l gaim
2979 gaim
[root@localhost beinan]# pkill gaim

  3.4 xkill

  xkill 是在桌面用的殺死圖形介面的程式。比如當firefox 出現崩潰不能退出時,點滑鼠就能殺死firefox 。當xkill執行時出來和個人腦骨的圖示,哪個圖形程式崩潰一點就OK了。如果您想終止xkill ,就按右鍵取消;

  xkill 呼叫方法:

  [root@localhost ~]# xkill

4、top 監視系統任務的工具;

  和ps 相比,top是動態監視系統任務的工具,top 輸出的結果是連續的;

  4.1 top 命令用法及引數;

  top 呼叫方法:

  top 選擇引數

  引數:

  -b 以批次模式執行,但不能接受命令列輸入;  -c 顯示命令列,而不僅僅是命令名;  -d N 顯示兩次重新整理時間的間隔,比如 -d 5,表示兩次重新整理間隔為5秒;  -i 禁止顯示空閒程式或殭屍程式;  -n NUM 顯示更新次數,然後退出。比如 -n 5,表示top更新5次資料就退出;  -p PID 僅監視指定程式的ID;PID是一個數值;  -q 不經任何延時就重新整理;  -s 安全模式執行,禁用一些效互指令;  -S 累積模式,輸出每個程式的總的CPU時間,包括已死的子程式;

  互動式命令鍵位:

  space 立即更新;  c 切換到命令名顯示,或顯示整個命令(包括引數);  f,F 增加顯示欄位,或刪除顯示欄位;  h,? 顯示有關安全模式及累積模式的幫助資訊;  k 提示輸入要殺死的程式ID,目的是用來殺死該程式(默人訊號為15)  i 禁止空閒程式和殭屍程式;  l 切換到顯法負載平均值和正常執行的時間等資訊;  m 切換到記憶體資訊,並以記憶體佔用大小排序;  n 提示顯示的程式數,比如輸入3,就在整屏上顯示3個程式;  o,O 改變顯示欄位的順序;  r 把renice 應用到一個程式,提示輸入PID和renice的值;  s 改變兩次重新整理時間間隔,以秒為單位;  t 切換到顯示程式和CPU狀態的資訊;  A 按程式生命大小進行排序,最新程式顯示在最前;  M 按記憶體佔用大小排序,由大到小;  N 以程式ID大小排序,由大到小;  P 按CPU佔用情況排序,由大到小  S 切換到累積時間模式;  T 按時間/累積時間對任務排序;  W 把當前的配置寫到~/.toprc中;

4.2 top 應用舉例;

  [root@localhost ~]# top

  然後根據前面所說互動命令按個嘗試一下就明白了,比如按M,就按記憶體佔用大小排序;這個例子舉不舉都沒有必要了。呵。。。。。。

  當然您可以把top的輸出傳到一個檔案中;

  [root@localhost ~]# top > mytop.txt

  然後我們就可以檢視mytop檔案,以慢慢的分析系統程式狀態;

  5、程式的優先順序:nice和renice;

  在Linux 作業系統中,程式之間是竟爭資源(比如CPU和記憶體的佔用)關係。這個竟爭優劣是透過一個數值來實現的,也就是謙讓度。高謙讓度表示程式最佳化級別最低。負值或0表示對高優點級,對其它程式不謙讓,也就是擁有優先佔用系統資源的權利。謙讓度的值從-20到19。

  目前硬體技術發展極速,在大多情況下,不必設定程式的優先順序,除非在程式失控而瘋狂佔用資源的情況下,我們有可能來設定一下優先順序,但我個人感覺沒有太大的必要,在迫不得已的情況下,我們可以殺掉失控程式。

  nice 可以在建立程式時,為程式指定謙讓度的值,程式的優先順序的值是父程式SHELL的優先順序的值與我們所指定謙讓度的相加和。所以我們在用nice設定程式的優先順序時,所指定數值是一個增量,並不是優先順序的絕對值;

  nice 的應用舉例:

  [root@localhost ~]# nice -n 5 gaim & 注:執行gaim程式,併為它指定謙讓度增量為5;

  所以nice的最常用的應用就是:

  nice -n 謙讓度的增量值 程式

  renice 是透過程式ID(PID)來改變謙讓度,進而達到更改程式的優先順序。

  renice 謙讓度 PID

  renice 所設定的謙讓度就是程式的絕對值;看下面的例子;

[root@localhost ~]# ps lax |grep gaim

4 0 4437 3419 10 -5 120924 20492 - S< pts/0 0:01 gaim

0 0 4530 3419 10 -5 5160 708 - R pts/0 0:00 grep gaim

[root@localhost ~]# renice -6 4437

4437: old priority -5, new priority -6

[root@localhost ~]# ps lax |grep gaim

4 0 4437 3419 14 -6 120924 20492 - S< pts/0 0:01 gaim

0 0 4534 3419 11 -5 5160 708 - R pts/0 0:00 grep gaim

  6、關於本文;

  程式管理還是需要的,雖然在桌面應用上,我們點滑鼠就能完成大多的工作,但在伺服器管理中,程式管理還是十分重要的。

  有的弟兄會說,為什麼您不說說在桌面環境中的圖形管理的程式工具。我感覺沒有太大的必要,如果您會點滑鼠就應該能找到有關程式管理的工具。

  還有的弟兄會說:Windows的程式管理真的很方便,按一下CTRL+ALT+DEL就可以調出來,隨便你怎麼殺和砍。我感覺Windows的程式管理並不怎麼樣,如果有的程式真的需要CTRL+ALT+DEL的話,呵,那肯定會出現系統假死現象。或者程式錯誤之類的提示。弄不好就得重啟,這是事實吧。

  Windows 的程式管理並不優秀,只是一個友好的介面而已,我想我說的沒錯吧;


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1701142/viewspace-891823/,如需轉載,請註明出處,否則將追究法律責任。

相關文章