linux 進程管理相關內容
簡介 當我們運行程式時,Linux會為程式建立一個特殊的環境,該環境包含程式運行需要的所有資源,以保證程式能夠獨立運行,不受其他程式的幹擾。這個特殊的環境就稱為進程。 每個 Linux 命令都與系統中的程式對應,輸入命令,Linux 就會建立一個新的進程。例如使用 ls 命令遍曆目錄中的檔案時,就建立了一個進程。 簡而言之,進程就是程式的執行個體。 系統通過一個五位元字跟蹤程式的運行狀態,這個數字稱為 pid 或進程ID。每個進程都擁有唯一的 pid。 理論上,五位元字是有限的,當數字被用完時,下一個 pid 就會重新開始,所以 pid 最終會重複。但是,兩個 pid 一樣的進程不能同時存在,因為Linux會使用 pid 來跟蹤程式的運行狀態。 建立進程有兩種方式來建立進程:前台進程和後台進程。 前台進程 預設情況下,使用者建立的進程都是前台進程;前台進程從鍵盤讀取資料,並把處理結果輸出到顯示器。 我們可以看到前台進程的運行過程。例如,使用 ls 命令來遍曆目前的目錄下的檔案: $ls ch*.docch01-1.doc ch010.doc ch02.doc ch03-2.docch04-1.doc ch040.doc ch05.doc 這個程式就運行在前台,它會直接把結果輸出到顯示器。如果 ls 命令需要資料(實際上不需要),那麼它會等待使用者從鍵盤輸入。 當程式運行在前台時,由於命令提示字元($)還未出現,使用者不能輸入其他命令;即使程式需要運行很長時間,也必須等待程式運行結束才能輸入其他命令。 後台進程 後台進程與鍵盤沒有必然的關係。當然,後台進程也可能會等待鍵盤輸入。 後台進程的優點是不必等待程式運行結束就可以輸入其他命令。 建立後台進程最簡單的方式就是在命令的末尾加 &,例如: $ls ch*.doc &ch01-1.doc ch010.doc ch02.doc ch03-2.docch04-1.doc ch040.doc ch05.doc ch06-2.docch01-2.doc ch02-1.doc如果 ls 命令需要輸入(實際上不需要),那麼它會暫停,直到使用者把它調到前台並從鍵盤輸入資料才會繼續運行。 查看正在啟動並執行進程可以使用 ps 命令查看進程的運行狀態,包括後台進程,例如: $psPID TTY TIME CMD18358 ttyp3 00:00:00 sh18361 ttyp3 00:01:31 abiword18789 ttyp3 00:00:00 ps 還可以結合 -f 選項查看更多資訊,f 是 full 的縮寫,例如: $ps -fUID PID PPID C STIME TTY TIME CMDamrood 6738 3662 0 10:23:03 pts/6 0:00 first_oneamrood 6739 3662 0 10:22:54 pts/6 0:00 second_oneamrood 3662 3657 0 08:10:53 pts/6 0:00 -kshamrood 6892 3662 4 10:51:50 pts/6 0:00 ps -f 每列的含義如下: 列 描述UID 進程所屬使用者的ID,即哪個使用者建立了該進程。PID 進程ID。PPID 父進程ID,建立該進程的進程稱為父進程。C CPU使用率。STIME 進程被建立的時間。TTY 與進程有關的終端類型。TIME 進程所使用的CPU時間。CMD 建立該進程的命令。 ps 命令還有其他一些選項: 選項 說明-a 顯示所有使用者的所有進程。-x 顯示無終端的進程。-u 顯示更多資訊,類似於 -f 選項。-e 顯示所有進程。 終止進程當進程運行在前台時,可以通過 kill 命令或 Ctrl+C 按鍵組合來結束進程。 如果進程運行在後台,那麼首先要通過 ps 命令來擷取進程ID,然後使用 kill 命令“殺死”進程,例如: $ps -fUID PID PPID C STIME TTY TIME CMDamrood 6738 3662 0 10:23:03 pts/6 0:00 first_oneamrood 6739 3662 0 10:22:54 pts/6 0:00 second_oneamrood 3662 3657 0 08:10:53 pts/6 0:00 -kshamrood 6892 3662 4 10:51:50 pts/6 0:00 ps -f$kill 6738Terminated 如上所示,kill 命令終結了 first_one 進程。 如果進程忽略 kill 命令,那麼可以通過 kill -9 來結束: $kill -9 6738Terminated1.命令格式: kill[參數][進程號] 2.命令功能: 發送指定的訊號到相應進程。不指定型號將發送SIGTERM(15)終止指定進程。如果任無法終止該程式可用“-KILL” 參數,其發送的訊號為SIGKILL(9) ,將強制結束進程,使用ps命令或者jobs 命令可以查看進程號。root使用者將影響使用者的進程,非root使用者只能影響自己的進程。 3.命令參數: -l 訊號,若果不加訊號的編號參數,則使用“-l”參數會列出全部的訊號名稱 -a 當處理當前進程時,不限制命令名和進程號的對應關係 -p 指定kill 命令只列印相關進程的進程號,而不發送任何訊號 -s 指定發送訊號 -u 指定使用者 注意: 1、kill命令可以帶訊號號碼選項,也可以不帶。如果沒有訊號號碼,kill命令就會發出終止訊號(15),這個訊號可以被進程捕獲,使得進程在退出之前可以清理並釋放資源。也可以用kill向進程發送特定的訊號。例如: kill -2 123 它的效果等同於在前台運行PID為123的進程時按下Ctrl+C鍵。但是,普通使用者只能使用不帶signal參數的kill命令或最多使用-9訊號。 2、kill可以帶有進程ID號作為參數。當用kill向這些進程發送訊號時,必須是這些進程的主人。如果試圖撤銷一個沒有許可權撤銷的進程或撤銷一個不存在的進程,就會得到一個錯誤資訊。 3、可以向多個進程發訊號或終止它們。 4、當kill成功地發送了訊號後,shell會在螢幕上顯示出進程的終止資訊。有時這個資訊不會馬上顯示,只有當按下Enter鍵使shell的命令提示字元再次出現時,才會顯示出來。 5、應注意,訊號使進程強行終止,這常會帶來一些副作用,如資料丟失或者終端無法恢複到正常狀態。發送訊號時必須小心,只有在萬不得已時,才用kill訊號(9),因為進程不能首先捕獲它。要撤銷所有的後台作業,可以輸入kill 0。因為有些在後台啟動並執行命令會啟動多個進程,跟蹤並找到所有要殺掉的進程的PID是件很麻煩的事。這時,使用kill 0來終止所有由當前shell啟動的進程,是個有效方法。 訊號說明: 只有第9種訊號(SIGKILL)才可以無條件終止進程,其他訊號進程都有權利忽略。 下面是常用的訊號: HUP 1 終端斷線 INT 2 中斷(同 Ctrl + C) QUIT 3 退出(同 Ctrl + \) TERM 15 終止 KILL 9 強制終止 CONT 18 繼續(與STOP相反, fg/bg命令) STOP 19 暫停(同 Ctrl + Z) 父進程和子進程每個 Linux 進程會包含兩個進程ID:當前進程ID(pid)和父進程ID(ppid)。可以暫時認為所有的進程都有父進程。 由使用者啟動並執行大部分命令都將 Shell 作為父進程,使用 ps -f 命令可以查看當前進程ID和父進程ID。 殭屍進程和孤兒進程正常情況下,子進程被終止時會通過 SIGCHLD 訊號通知父進程,父進程可以做一些清理工作或者重新啟動一個新的進程。但在某些情況下,父進程會在子進程之前被終止,那麼這些子進程就沒有了“父親”,被稱為孤兒進程。 init 進程會成為所有孤兒進程的父進程。init 的 pid 為1,是Linux系統的第一個進程,也是所有進程的父進程。 如果一個進程被終止了,但是使用 ps 命令仍然可以查看該進程,並且狀態為 Z,那麼這就是一個殭屍進程。殭屍進程雖然被終止了,但是仍然存在於進程列表中。一般殭屍進程很難殺掉,你可以先殺死他們的父進程,讓他們變成孤兒進程,init 進程會自動清理殭屍進程。 常駐進程常駐進程一般是系統級進程,以 root 許可權運行在後台,可以處理其他進程的請求。 常駐進程沒有終端,不能訪問 /dev/tty 檔案,如果使用 ps -ef 查看該進程,tty 這一列會顯示問號(?)。 更確切地說,常駐進程通常運行在後台,等待指定事件發生,例如列印進程是一個常駐進程,它會等待使用者輸入列印相關的命令並進行處理。 top命令top 命令是一個很有用的工具,它可以動態顯示正在啟動並執行進程,還可以按照指定條件對進程進行排序,與Windows的工作管理員類似。 top 命令可以顯示進程的很多資訊,包括實體記憶體、虛擬記憶體、CPU使用率、平均負載以及繁忙的進程等。例如: $top任務和進程任務(task)是最抽象的,是一個一般性的術語,指由軟體完成的一個活動。一個任務既可以是一個進程,也可以是多個進程。簡而言之,它指的是一系列共同達到某一目的的操作。例如,讀取資料並將資料放入記憶體中。這個任務可以由一個進程來實現,也可以由多個進程來實現。 每個任務都有一個數字表示的任務號。 進程(process)常常被定義為程式的執行。可以把一個進程看成是一個獨立的程式,在記憶體中有其完備的資料空間和代碼空間。一個進程所擁有的資料和變數只屬於它自己。 jobs 命令可以用來查看系統中正在啟動並執行任務,包括後台啟動並執行任務。該命令可以顯示任務號及其對應的進程ID。一個任務可以對應於一個或者多個進程號。 jobs 命令的 -l 選項可以查看當前任務包含的進程ID: $jobs -l[1] + 1903 running ls ch*.doc &$其中,第一列表示任務號,第二列表示任務對應的進程ID,第三列表示任務的運行狀態,第四列表示啟動任務的命令。 前台任務和背景工作的切換fg 命令可以將背景工作調到前台,文法為: $fg %jobnumberjobnumber 是通過 jobs 命令擷取的背景工作的的序號,注意不是pid。如果後台只有一個任務,可以不指定 jobnumber。 bg 命令可以將後台暫停任務,調到前台繼續運行,文法為: $bg %jobnumber jobnumber 同樣是通過 jobs 命令擷取的背景工作的的序號,注意不是pid。如果前台只有一個任務,可以不指定 jobnumber。 如果希望將當前任務轉移到後台,可以先 Ctrl+z 暫停任務,再使用 bg 命令。任務轉移到後台可以空出終端,繼續輸入其他命令。