一 、進程的概念和分類
1.進程的概念
Linux是一個多用戶多任務的操作系統。多用戶是指多個用戶可以在同一時間使用同一個linux系統;多任務是指在Linux下可以同時執行多個任務,更詳細的說,linux采用了分時管理的方法,所有的任務都放在一個隊列中,操作系統根據每個任務的優先級為每個任務分配合適的時間片,每個時間片很短,用戶根本感覺不到是多個任務在運行,從而使所有的任務共同分享系統資源,因此linux可以在一個任務還未執行完時,暫時掛起此任務,又去執行另一個任務,過一段時間以后再回來處理這個任務,直到這個任務完成,才從任務隊列中去除。這就是多任務的概念。
上面說的是單CPU多任務操作系統的情形,在這種環境下,雖然系統可以運行多個任務,但是在某一個時間點,CPU只能執行一個進程,而在多CPU多任務的操作系統下,由于有多個CPU,所以在某個時間點上,可以有多個進程同時運行。
進程的的基本定義是:在自身的虛擬地址空間運行的一個獨立的程序,從操作系統的角度來看,所有在系統上運行的東西,都可以稱為一個進程。
需要注意的是:程序和進程是有區別的,進程雖然有程序產生,但是它并不是程序,程序是一個進程指令的集合,它可以啟用一個或多個進程,同時,程序只占用磁盤空間,而不占用系統運行資源,而進程僅僅占用系統內存空間,是動態的、可變的,關閉進程,占用的內存資源隨之釋放。
例如,用戶在linux上打開一個文件、就會產生一個打開文件的進程,關閉文件,進程也隨機關閉。如果在系統上啟動一個服務,例如啟動tomcat服務,就會產生一個對應的java的進程。而如果啟動apache服務,就會產生多個httpd進程。
2.進程的分類
按照進程的功能和運行的程序分類,進程可劃分為兩大類:
? 系統進程:可以執行內存資源分配和進程切換等管理工作;而且,該進程的運行不受用戶的干預,即使是root用戶也不能干預系統進程的運行。
? 用戶進程:通過執行用戶程序、應用程序或內核之外的系統程序而產生的進程,此類進程可以在用戶的控制下運行或關閉。
針對用戶進程,又可以分為交互進程、批處理進程和守護進程三類。
? 交互進程:由一個shell終端啟動的進程,在執行過程中,需要與用戶進行交互操作,可以運行于前臺,也可以運行在后臺。
? 批處理進程:該進程是一個進程集合,負責按順序啟動其他的進程。
? 守護進程:守護進程是一直運行的一種進程,經常在linux系統啟動時啟動,在系統關閉時終止。它們獨立于控制終端并且周期性的執行某種任務或等待處理某些發生的事件。例如httpd進程,一直處于運行狀態,等待用戶的訪問。還有經常用的crond進程,這個進程類似與windows的計劃任務,可以周期性的執行用戶設定的某些任務。
3.進程的屬性
(1)進程的幾種狀態
進程在啟動后,不一定馬上開始運行,因而進程存在很多種狀態。
? 可運行狀態:處于這種狀態的進程,要么正在運行、要么正準備運行。
? 可中斷的等待狀態:這類進程處于阻塞狀態,一旦達到某種條件,就會變為運行態。同時該狀態的進程也會由于接收到信號而被提前喚醒進入到運行態。
? 不中斷的等待狀態:與“可中斷的等待狀態”含義基本類似,唯一不同的是處于這個狀態的進程對信號不做響應。
? 僵死狀態:也就是僵死進程,每個進程在結束后都會處于僵死狀態,等待父進程調用進而釋放資源,處于該狀態的進程已經結束,但是它的父進程還沒有釋放其系統資源。
? 暫停狀態:表明此時的進程暫時停止,來接收某種特殊處理,
(2)進程之間的關系
在linux系統中,進程ID(用PID表示)是區分不同進程的唯一標識,它們的大小是有限制的,最大ID為32768,用UID和GID分別表示啟動這個進程的用戶和用戶組。所有的進程都是PID為1的init進程的后代,內核在系統啟動的最后階段啟動init進程,因而,這個進程是linux下所有進程的父進程,用PPID表示父進程。
下面是通過ps命令輸出的sendmail進程信息:
[root@localhost ~]# ps -ef|grep sendmail
UID PID PPID C STIME TTY TIME CMD
root 3614 1 0 Oct23 ? 00:00:00 sendmail: accepting connections
相對于父進程,就存在子進程,一般每個進程都必須有一個父進程,父進程與子進程之間是管理與被管理的關系,當父進程停止時,子進程也隨之消失,但是子進程關閉,父進程不一定終止。
如果父進程在子進程退出之前就退出,那么所有子進程就變成的一個孤兒進程,如果沒有相應的處理機制的話,這些孤兒進程就會一直處于僵死狀態,資源無法釋放,此時解決的辦法是在啟動的進程內找一個進程作為這些孤兒進程的父進程,或者直接讓init進程作為它們的父進程,進而釋放孤兒進程占用的資源。
二、 進程的監控與管理
Linux下,監控和管理進程的命令有很多,下面我們以ps、top、pstree、lsof四個最常用的指令介紹如果有效的監控和管理linux下的各種進程。
2.1 利用ps命令監控系統進程
其中,UID是用戶的ID標識號,PID是進程的標識號,PPID表示父進程,STIME表示進程的啟動時間,TTY表示進程所屬的終端控制臺,TIME表示進程啟動后累計使用的CPU總時間,CMD表示正在執行的命令。
從中可以清楚的看出,父進程和子進程的對應關系, PPID為26037的所有進程均為子進程,而PID為26037的進程是所有子進程的父進程,子進程由nobody用戶啟動,而父進程由root用戶啟動,父進程對應的PPID為1,即父進程同時為init進程的子進程。
利用pstree監控系統進程
pstree命令以樹形結構顯示程序和進程之間的關系,使用格式如下:
pstree [-acnpu] [<PID>/<user>]
選項含義如下:
? -a 顯示啟動每個進程對應的完整指令,包含啟動進程的路徑、參數等等。
? -c 不使用精簡法顯示進程信息,即顯示的進程中包含子進程和父進程。
? -n 根據進程PID號來排序輸出,默認是以程序名稱排序輸出的。
? -p 顯示進程的PID。
? -u 顯示進程對應的用戶名稱。
? PID:即進程對應的PID號,或者叫進程識別號。
? user:系統用戶名。
pstree清楚的顯示了程序和進程之間的關系,如果不指定進程的PID號,或者不指定用戶名稱,則將以init進程為根進程,顯示系統的所有程序和進程信息,若指定用戶或PID,則將以用戶或PID為根進程,顯示用戶或PID對應的所有程序和進程。
利用top監控系統進程
top命令是監控系統進程必不可少的工具,與ps命令相比,top命令動態、實時的顯示進程狀態,而ps只能顯示進程某一時刻的信息,同時,top命令提供了一個交互界面,用戶可以根據需要,人性化的定制自己的輸出,更清楚的了解進程的實時狀態。
?欄位信息簡介 PID (Process Id):任務的進程ID PPID (Parent Process Pid):父任務的進程ID RUSER (Real User Name):任務的所有者真實名稱 UID (User Id):任務所有者ID USER (User Name):任務所有者名稱 GROUP (Group Name):任務所有者群組名 TTY (Controlling Tty):終端 PR (Priority):優先級 %CPU (CPU usage):CPU使用率 %MEM (Memory usage (RES)):內存使用率 S (Process Status):進程狀態 TIME+ (CPU Time, hundredths):CPU時間,精確到秒
系統監控工具htop
glances系統監控工具
? 常用選項:
-b: 以Byte為單位顯示網卡數據速率
-d: 關閉磁盤I/O模塊
-f /path/to/somefile: 設定輸入文件位置
-o {HTML|CSV}:輸出格式
-m: 禁用mount模塊
-n: 禁用網絡模塊
-t #: 延遲時間間隔
-1:每個CPU的相關數據單獨顯示
系統監控工具
?dstat命令:
系統資源統計 ?
dstat [-afv] [options..] [delay [count]]
-c: 顯示cpu相關信息
-C #,#,…,total
-d: 顯示disk相關信息
-D total,sda,sdb,…
-g:顯示page相關統計數據
-m: 顯示memory相關統計數據
-n: 顯示network相關統計數據
-p: 顯示process相關統計數據
-r: 顯示io請求相關的統計數據
-s: 顯示swapped相關的統計數據
–tcp ?
–udp ?
–unix ?
–raw ?
–socket ?
–ipc ?
–top-cpu:顯示最占用CPU的進程 ?
–top-io: 顯示最占用io的進程 ?
–top-mem: 顯示最占用內存的進程 ?
–top-latency: 顯示延遲最大的進程
進程管理工具
? kill命令:
向進程發送控制信號,以實現對進程管理
顯示當前系統可用信號: kill -l
常用信號:man 7 signal
1) SIGHUP: 無須關閉進程而讓其重讀配置文件
2) SIGINT: 中止正在運行的進程;相當于Ctrl+c
9) SIGKILL: 殺死正在運行的進程
15) SIGTERM:終止正在運行的進程
18) SIGCONT:繼續運行
19) SIGSTOP:后臺休眠
指定信號的方法:
(1) 信號的數字標識;1, 2, 9
(2) 信號完整名稱;SIGHUP
(3) 信號的簡寫名稱;HUP
進程管理工具
?
按PID:kill [-SIGNAL] pid … ?
按名稱:killall [-SIGNAL] comm… ?
按模式:pkill [options] pattern
-SIGNAL -u uid: effective user,生效者
-U uid: real user,真正發起運行命令者
-t terminal: 與指定終端相關的進程
-l: 顯示進程名
-a: 顯示完整格式的進程名
-P pid: 顯示父進程為此處指定的進程的進程列表
原創文章,作者:xiaoqiang512,如若轉載,請注明出處:http://www.www58058.com/47220
寫的不錯,圖文并茂,并且對各個命令也結果意義也定義的很清楚。