linux進程管理簡析


linux多任務概念:
    linux採用分時管理的方法,所有的任務都放在一個隊列中,操作系統根據每個任務的優先級爲每個任務分配合適的時間片,從而使所有的任務共同分享系統資源,因此linux可以在一個任務還未執行完成時,暫時掛起此任務,又去執行另一個任務,過一段時間以後再回來處理這個任務,直到這個任務完成,才從任務隊列中去除,這個就是多任務的概念。
    進程:在自身的虛擬地址空間運行的一個獨立的程序,從操作系統的角度來看,所有在系統上運行的東西,都可以稱爲一個進程。
    程序和進程的區別:進程由程序產生單並不是程序。程序是一個進程指令的結合。程序佔用磁盤空間。進程佔用內存空間,是動態,可變的,關閉進程,佔用的內存資源隨之釋放。
    進程的分類:
        系統進程:可以執行內存資源分配和進程切換等管理工作,而且,該進程不受用戶干預,(root也不可以)
                用ps -ef 查看 [] 包含的進程一般爲系統進程。
        用戶進程:通過執行用戶程序,應用程序或內核之外的系統程序而產生的進程,用戶控制。
         對於用戶進程:分爲交互進程,批處理進程和守護進程三類。
        1.交互進程:由一個shell終端啓動的進程,需要與用戶進行交互操作,可運行與前臺或後臺
        2.批處理進程:一個進程集合,負責按順序啓動其他的進程
        3.守護進程:一直運行着的進程,直到系統關閉。比如crond。還有開啓的httpd進程。
    linux進程的幾個狀態
1. Linux進程狀態:R (TASK_RUNNING),可執行狀態&運行狀態(在run_queue隊列裏的狀態)
2. Linux進程狀態:S (TASK_INTERRUPTIBLE),可中斷的睡眠狀態, 可處理signal
3. Linux進程狀態:D (TASK_UNINTERRUPTIBLE),不可中斷的睡眠狀態, 可處理signal, 有延遲
4. Linux進程狀態:T (TASK_STOPPED or TASK_TRACED),暫停狀態或跟蹤狀態, 不可處理signal, 因爲根本沒有時間片運行代碼
5. Linux進程狀態:Z (TASK_DEAD - EXIT_ZOMBIE),退出狀態,進程成爲殭屍進程。不可被kill, 即不響應任務信號, 無法用SIGKILL殺死
    進程之間的關係。
        在linux系統中,進程ID(用PID表示)是區分不同進程的唯一標識。它的大小有限最大ID32768,所有的進程都是PID爲1的init進程的後代,內核在系統啓動的最後階段啓動init進程。因此,這個進程時linux下所有及暱稱的父進程,用PPID表示父進程。每個進程作爲子進程都必須由父進程管理。當父進程停止,子進程也隨之消失。僵死狀態就是子進程結束。父進程沒有釋放系統資源。
    常用命令:
       1. ps -ef
        UID        PID  PPID  C STIME TTY          TIME CMD
        root         1     0  0 03:20 ?        00:00:01 /usr/lib/systemd/systemd
        其中,UID是用戶的ID標識號,PID是進程的標識號,PPID表示父進程,STIME表示進程的啓動時間,TTY表示進程所屬的終端控制檯,TIME表示進程啓動後累計使用的CPU總時間,CMD表示正在執行的命令。
        # ps auxf
        USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
        root         2  0.0  0.0      0     0 ?        S    03:20   0:00 [kthreadd]
        其中,%CPU表示進程佔用的CPU百分比,%MEM表示進程佔用內存的百分比,VSZ表示進程虛擬大小,RSS表示進程的實際內存(駐留集)大小(單位是頁)。STAT表示進程的狀態,進程的狀態有很多種:用“R”表示正在運行中的進程,用“S”表示處於休眠狀態的進程,  用“Z”表示僵死進程,用“<”表示優先級高的進程,用“N”表示優先級較低的進程,用“s”表示父進程,用“+”表示位於後臺的進程。START表示啓動進程的時間。
    2. pstree 以樹形結構顯示程序和進程之間的關係。
        格式  :  pstree [-acnpu] [<PID>/<user>]
        選項含義如下:
            -a 顯示啓動每個進程對應的完整指令,包括啓動進程的路徑,參數等等。
            -c 顯示過程中包含子進程和父進程
            -n 根據進程PID來排序輸出,默認以程序名稱排序輸出
            -p 顯示進程PID
            -u 顯示進程對應的用戶名稱
            PID  進程對應的PID 號
            user 系統用戶名
    3.top
    4.lsof (list opened files) 列舉系統中已經被打開的文件
        lsof filename 顯示使用filename文件的進程
        lsof  -c  softname  顯示 進程打開的文件數
            這個數字受系統限制  ulimit -a
        lsof  -p PID 根據進程號顯示進程打開的文件
        lsof -i 通過監聽指定的協議、端口、主機等信息,顯示符合條件的進程信息。

    5.pgrep 通過程序名字來查詢進程pid的工具
            參數:
                -l 此參數列出程序名和進程ID值
                -o 此參數用來顯示進程起始ID值
                -n 此參數用來顯示進程終止ID值
                -f  匹配command中的關鍵字 (如果想匹配mysqld  如果有-F 參數可以寫成 my就可以找到mysqld)
                -G 此參數匹配指定組啓動的進程相應的ID值。
    對比命令:查找進程的PID
        # ps -ef | grep mysqld| grep -v grep|awk '{print $2}'
        2713
        2858
        # pgrep mysql
        2713
        2858
    crond任務計劃:
        主配置文件:/etc/crontab
    # Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,
sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
    minute: 表示分鐘,可以是從0到59之間的任何整數。
    hour:表示小時,可以是從0到23之間的任何整數。
    day:表示日期,可以是從1到31之間的任何整數。
    month:表示月份,可以是從1到12之間的任何整數。
    week:表示星期幾,可以是從0到7之間的任何整數,這裏的0或7代表星期日。
    command:要執行的命令,可以是系統命令,也可以是自己編寫的腳本文件。
    在以上各個字段中,還可以使用以下特殊字符:
    星號(*):代表所有可能的值,例如month字段如果是星號,則表示在滿足其它字段的制約條件後每月都執行該命令操作。
    逗號(,):可以用逗號隔開的值指定一個列表範圍,例如,“1,2,5,7,8,9”
    中槓(-):可以用整數之間的中槓表示一個整數範圍,例如“2-6”表示“2,3,4,5,6”
    正斜線(/):可以用正斜線指定時間的間隔頻率,例如“0-23/2”表示每兩小時執行一次。同時正斜線可以和星號一起使用,例如*/10,如果用在minute字段,表示每十分鐘執行一次。
    crontab文件舉例
    0 */5 * * * /usr/local/apache2/apachectl restart
    表示每隔5個小時重啓apache服務一次。
     10 1 * * 6 /webdata/bin/backup.sh
    表示每週六的1點10分執行/webdata/bin/backup.sh腳本的操作。
     0 0 5,25 * *  fsck /dev/sdb8
    表示每個月的5號和25號檢查/dev/sdb8磁盤設備。
     10 5 */5 * *  echo "">/usr/local/apache2/log/access_log
    表示每個月的5號、10號、15號、20號、25號、30號的5點10分執行清理apache日誌操作。
    crond 注意事項
        1.注意環境變量
            指定crontab文件中指定任務運行所需的所有環境變量。腳本需要shell環境的支持。
        2.注意清理系統用戶的郵件日誌
            任務調度執行後,系統將輸出信息通過電子郵件形式發送給當前系統用戶。
            這裏可以通過重定向忽略日誌信息。
            > /dev/null 2>&1  (將正確的信息和錯誤的信息都重定向輸出給/dev/null)
        3.系統級任務和用戶級別的任務調度
            由於權限不同。一般需要root權限的調度需要指定root通過 crontab -uroot -e
            或crontab -e  直接寫入。如果把一個系統級別的調度放入用戶下將不生效。
    關閉進程:(kill 終止一個進程)kill的本質:就是將指定的信號送至程序。
        語法: kill [信號類型] 進程 PID
        查看系統所有的信號名稱:
        kill -l| awk '{print $1$2,$3$4,$5$6,$7$8,$9$10}'|sed 's/ /\n/g'|grep -v "^$
        只有第9種信號(SIGKILL)纔可以無條件終止進程,其他信號進程都有權利忽略,下面是常用的信號:
         HUP 1 終端斷線
         INT 2 中斷(同 Ctrl + C)
         QUIT 3 退出(同 Ctrl + \)
         KILL 9 強制終止
         用來立即結束程序的運行. 本信號不能被阻塞、處理和忽略。如果管理員發現某個進程終止不了,可嘗試發送這個信號。
          TERM 15 終止   shell的默認類型
         程序結束(terminate)信號, 與SIGKILL不同的是該信號可以被阻塞和處理。通常用來要求程序自己正常退出,shell命令kill缺省產生這個信號。如果進程終止不了,我們纔會嘗試SIGKILL。
         CONT 18 繼續(與STOP相反)
         STOP 19 暫停(同 Ctrl + Z)
         一般我們用到 ctrl + C 相當於給進程發送  kill -2 進程PID
                      ctrl + Z 相當於給進程發送  kill -19 進程PID
        kill -9 進程PID
        killall  進程名稱
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章