Decode360's Blog

          業(yè)精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 ::  :: 管理 ::
            397 隨筆 :: 33 文章 :: 29 評論 :: 0 Trackbacks

          Linux 進程管理

          作者: 北南南北
          來自: LinuxSir.Org
          摘要: 本文講述的時進程管理的基本概念和進程管理工具介紹;文中的重點對進程管理工具的分類介紹及應用舉例,包括 ps pgrep top kill pkill killall nice renice 等工具。

          目錄

          1 、程序和進程;

          1.1 進程分類;
          1.2 進程的屬性;
          1.3 父進程和子進程;

          2 、進程管理;

          2.1 ps 監(jiān)視進程工具;

          2.1.1 ps 參數(shù)說明;
          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 監(jiān)視系統(tǒng)任務的工具;

          4.1 top 命令用法及參數(shù);
          4.2 top 應用舉例;

          5 、進程的優(yōu)先級: nice renice
          6 、關于本文;
          7 、后記;
          8 、參考文檔;
          9 、相關文檔;


          ++++++++++++++++++++++++++++++++++++++
          正文
          ++++++++++++++++++++++++++++++++++++++


          1
          、程序和進程;

          程序是為了完成某種任務而設計的軟件,比如 OpenOffice 是程序。什么是進程呢?進程就是運行中的程序。

          一個運行著的程序,可能有多個進程。 比如 LinuxSir.Org 所用的 WWW 服務器是 apache 服務器,當管理員啟動服務后,可能會有好多人來訪問,也就是說許多用戶來同時請求 httpd 服務, apache 服務器將會創(chuàng)建有多個 httpd 進程來對其進行服務。


          1.1
          進程分類;

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

          值得一提的是守護進程總是活躍的,一般是后臺運行,守護進程一般是由系統(tǒng)在開機時通過腳本自動激活啟動或超級管理用戶 root 來啟動。比如在 Fedora Redhat 中,我們可以定義 httpd 服務器的啟動腳本的運行級別,此文件位于 /etc/init.d 目錄下,文件名是 httpd /etc/init.d/httpd 就是 httpd 服務器的守護程序,當把它的運行級別設置為 3 5 時,當系統(tǒng)啟動時,它會跟著啟動。

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

          由于守護進程是一直運行著的,所以它所處的狀態(tài)是等待請求處理任務。比如,我們是不是訪問 LinuxSir.Org LinuxSir.Org httpd 服務器都在運行,等待著用戶來訪問,也就是等待著任務處理。


          1.2
          進程的屬性;

          進程 ID PID :是唯一的數(shù)值,用來區(qū)分進程;
          父進程和父進程的 ID PPID
          啟動進程的用戶 ID UID )和所歸屬的組( GID );
          進程狀態(tài):狀態(tài)分為運行 R 、休眠 S 、僵尸 Z
          進程執(zhí)行的優(yōu)先級;
          進程所連接的終端名;
          進程資源占用:比如占用資源大小(內(nèi)存、 CPU 占用量);


          1.3
          父進程和子進程;

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

          在進程管理中,當我們發(fā)現(xiàn)占用資源過多,或無法控制的進程時,應該殺死它,以保護系統(tǒng)的穩(wěn)定安全運行;


          2
          、進程管理;

          對于 Linux 進程的管理,是通過進程管理工具實現(xiàn)的,比如 ps kill pgrep 等工具;


          2.1 ps
          監(jiān)視進程工具;

          ps 為我們提供了進程的一次性的查看,它所提供的查看結果并不動態(tài)連續(xù)的;如果想對進程時間監(jiān)控,應該用 top 工具;


          2.1.1 ps
          的參數(shù)說明;

          ps 提供了很多的選項參數(shù),常用的有以下幾個;

          l? 長格式輸出;

          u? 按用戶名和啟動時間的順序來顯示進程;

          j? 用任務格式來顯示進程;

          f? 用樹形格式來顯示進程;

          a? 顯示所有用戶的所有進程(包括其它用戶);

          x? 顯示無控制終端的進程;

          r? 顯示運行中的進程;

          ww 避免詳細參數(shù)被截斷;

          我們常用的選項是組合是 aux lax ,還有參數(shù) f 的應用;

          ps aux lax 輸出的解釋;

          USER????? 進程的屬主;

          PID?????? 進程的ID

          PPID? ??? 父進程;

          %CPU????? 進程占用的CPU百分比;

          %MEM????? 占用內(nèi)存的百分比;

          NI??????? 進程的NICE值,數(shù)值大,表示較少占用CPU時間;

          VSZ ????? 進程虛擬大小;

          RSS? ???? 駐留中頁的數(shù)量;

          TTY? ???? 終端ID

          STAT ???? 進程狀態(tài)

          ??? D??? Uninterruptible sleep (usually IO)

          ??? R??? 正在運行可中在隊列中可過行的;

          ??? S??? 處于休眠狀態(tài);

          ??? T??? 停止或被追蹤;

          ??? W??? 進入內(nèi)存交換(從內(nèi)核2.6開始無效);

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

          ??? Z??? 僵尸進程;

          ??? <??? 優(yōu)先級高的進程

          ??? N??? 優(yōu)先級較低的進程

          ??? L??? 有些頁被鎖進內(nèi)存;

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

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

          ??? +??? 位于后臺的進程組; ?

          WCHAN???? 正在等待的進程資源;

          START ??? 啟動進程的時間;

          TIME????? 進程消耗CPU的時間;

          COMMAND ? 命令的名稱和參數(shù);


          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 參數(shù);父與子關系一目了然;


          2.2 pgrep

          pgrep 是通過程序的名字來查詢進程的工具,一般是用來判斷程序是否正在運行。在服務器的配置和管理中,這個工具常被應用,簡單明了;

          用法:

          #ps 參數(shù)選項?? 程序名

          常用參數(shù)

          -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 等進行。比如一個程序已經(jīng)死掉,但又不能退出,這時就應該考慮應用這些工具。

          另外應用的場合就是在服務器管理中,在不涉及數(shù)據(jù)庫服務器程序的父進程的停止運行,也可以用這些工具來終止。為什么數(shù)據(jù)庫服務器的父進程不能用這些工具殺死呢?原因很簡單,這些工具在強行終止數(shù)據(jù)庫服務器時,會讓數(shù)據(jù)庫產(chǎn)生更多的文件碎片,當碎片達到一定程度的時候,數(shù)據(jù)庫就有崩潰的危險。比如 mysql 服務器最好是按其正常的程序關閉,而不是用 pkill mysqld killall mysqld 這樣危險的動作;當然對于占用資源過多的數(shù)據(jù)庫子進程,我們應該用 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 來強制終止退出;

          比如一個程序已經(jīng)徹底死掉,如果 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 出現(xiàn)崩潰不能退出時,點鼠標就能殺死 firefox 。當 xkill 運行時出來和個人腦骨的圖標,哪個圖形程序崩潰一點就 OK 了。如果您想終止 xkill ,就按右鍵取消;

          xkill 調(diào)用方法:

          [root@localhost ~]# xkill


          4
          top 監(jiān)視系統(tǒng)任務的工具;

          ps 相比, top 是動態(tài)監(jiān)視系統(tǒng)任務的工具, top 輸出的結果是連續(xù)的;


          4.1 top
          命令用法及參數(shù);

          top 調(diào)用方法:

          top 選擇參數(shù)

          參數(shù):

          -b? 以批量模式運行,但不能接受命令行輸入;
          -c 顯示命令行,而不僅僅是命令名;
          -d N? 顯示兩次刷新時間的間隔,比如 -d 5,表示兩次刷新間隔為5秒;
          -i 禁止顯示空閑進程或僵尸進程;
          -n NUM? 顯示更新次數(shù),然后退出。比如 -n 5,表示top更新5次數(shù)據(jù)就退出;
          -p PID 僅監(jiān)視指定進程的IDPID是一個數(shù)值;
          -q? 不經(jīng)任何延時就刷新;
          -s? 安全模式運行,禁用一些效互指令;
          -S 累積模式,輸出每個進程的總的CPU時間,包括已死的子進程;


          交互式命令鍵位:

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


          4.2 top
          應用舉例;

          [root@localhost ~]# top

          然后根據(jù)前面所說交互命令按個嘗試一下就明白了,比如按 M ,就按內(nèi)存占用大小排序;這個例子舉不舉都沒有必要了。呵。。。。。。

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

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

          然后我們就可以查看 mytop 文件,以慢慢的分析系統(tǒng)進程狀態(tài);


          5
          、進程的優(yōu)先級: nice renice

          Linux 操作系統(tǒng)中,進程之間是竟爭資源(比如 CPU 和內(nèi)存的占用)關系。這個竟爭優(yōu)劣是通過一個數(shù)值來實現(xiàn)的,也就是謙讓度。高謙讓度表示進程優(yōu)化級別最低。負值或 0 表示對高優(yōu)點級,對其它進程不謙讓,也就是擁有優(yōu)先占用系統(tǒng)資源的權利。謙讓度的值從 20 19

          目前硬件技術發(fā)展極速,在大多情況下,不必設置進程的優(yōu)先級,除非在進程失控而瘋狂占用資源的情況下,我們有可能來設置一下優(yōu)先級,但我個人感覺沒有太大的必要,在迫不得已的情況下,我們可以殺掉失控進程。

          nice 可以在創(chuàng)建進程時,為進程指定謙讓度的值,進程的優(yōu)先級的值是父進程 SHELL 的優(yōu)先級的值與我們所指定謙讓度的相加和。所以我們在用 nice 設置程序的優(yōu)先級時,所指定數(shù)值是一個增量,并不是優(yōu)先級的絕對值;

          nice 的應用舉例:

          [root@localhost ~]# nice -n 5? gaim &?? 注:運行gaim程序,并為它指定謙讓度增量為5

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

          nice? -n? 謙讓度的增量值?? 程序

          renice 是通過進程 ID PID )來改變謙讓度,進而達到更改進程的優(yōu)先級。

          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
          、關于本文;

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

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

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

          Windows 的進程管理并不優(yōu)秀,只是一個友好的界面而已,我想我說的沒錯吧;


          7
          、后記;

          近些天一直在為網(wǎng)絡基礎文檔做計劃,當然也隨手寫一寫自己能寫的文檔, 比如本篇就是; 也想把論壇中的一些弟兄優(yōu)秀的教程整理出來,但后來一想,如果提交到 LinuxSir.Org 首頁上,肯定得做一些修改,如果我來修改倒不如讓作者自己來修改,自己寫的東西自己最明白,對不對???

          在準備網(wǎng)絡文檔計劃的過程中,向 etony 兄請教了一些基本的網(wǎng)絡基礎知識。我對網(wǎng)絡基礎理論基本不懂。聽 tony 兄解說的同時,我也做了筆記。同時也和 tony 兄討論了網(wǎng)絡基礎篇的布局和謀篇的事,這關系到初學者入手的問題,好象是小事,其實事情比較大。如果寫的文檔,新手讀不懂,老鳥又認為沒有價值,我看倒不如不寫。

          ?

          posted on 2009-01-14 19:57 decode360 閱讀(300) 評論(0)  編輯  收藏 所屬分類: 03.Linux
          主站蜘蛛池模板: 无极县| 道孚县| 陆丰市| 宜丰县| 罗定市| 昌邑市| 景宁| 溆浦县| 乐平市| 孝义市| 靖江市| 清水县| 长海县| 武胜县| 桃江县| 澄迈县| 深泽县| 托里县| 德安县| 博爱县| 德清县| 永仁县| 广宁县| 衡南县| 滦平县| 叙永县| 灯塔市| 霍城县| 铜鼓县| 安国市| 年辖:市辖区| 蕲春县| 博客| 滕州市| 拉萨市| 峨山| 灵寿县| 行唐县| 江阴市| 柘荣县| 浏阳市|