先說一下程序吧,程序是一個靜態概念,它是“實際存在”于操作系統中的一段指令,或者代碼,總之,它是一段可以被成功解釋的腳本,或者被編譯的代碼,在操作系統中我們可以直觀的看到。
而進程是一個動態概念,它是指程序運行的過程。
*進程和程序沒有直接的關系,一個程序可以啟動多個進程,一個進程可以被多個程序調用。
一個常用的查看進程的命令是ps,他能生成一個當前的進程快照
示例:ps

直接使用”ps”我們可以看到有兩行數據,一個bash,也就是當前的shell,另一個就是ps本身。我們看到有一列叫PID,它意為進程的ID;TTY,是teletype的縮寫,表示終端的類型。TIME表示占用CPU的時間。
不過直接使用ps信息量來得太少,而且他只顯示當前終端相關的進程。
有一組常用的命令組合是aux,這能給我們提供足夠的信息

aux選項顯示了所有用戶的進程。值得一提的是,ps能夠接受多個不同版本Unix的參數,比如剛才說的aux這組參數,就是BSD的參數,而列表也是BSD風格的。標準一組常用參數是-ef,和aux類似。
以aux這組參數展示的列表為例,說明一下每一列的含義
- USER:表示進程的所有者
- PID:進程ID號
- %CPU:CPU的使用率
- %MEM:內存的使用率
- VSZ:虛擬內存大小
- RSS:占用的內容的大小
- START:進程運行的起始時間,超過24個小時則按天顯示
- TTY:已經提過,是終端的類型,但是圖上我們看到很多終端顯示“?”,這表示他們沒有控制終端
這其中多說一下STATE列,這一列表示進程的狀態,進程的狀態有很多種
- R:運行狀態,running
- S:休眠狀態,sleeping
- D:不可中斷的休眠狀態
- T:進程終止
- Z:zombie!這是一個死進程,或者說僵尸進程
- <:高優先級別的進程,“不友好的進程”
- N:低優先級別的進程,“友好的進程”
上面有幾個名詞需要額外說一下
*僵尸進程:一個進程可以產生另外一個進程,產生的新進程則為子進程,如果子進程已經終止,并且父進程沒有從進程列表里清空他,那么子進程就變僵尸了…
*進程優先級別:雖然我們在使用電腦的時候,感覺他同時在做許多事情,但其實他是在飛快的輪換著做很多事,飛快的程度讓我們感覺不出他是在輪換著執行,更像是同時執行,既然是輪換執行,那么就有先后之分,進程優先級別越高,那么該進程就會占用更多的CPU時間,級別低的自然就占用的少了。
和ps相似的一個命令叫pstree,輸出一個樹型結構的進程列表,會展示進程間父/子關系。
程序啟動時,調整進程的優先級別:nice
nice只能在程序啟動時調整他的優先級別
用法:nice -n 程序,n代表優先級別,取值范圍是-20~19,取值范圍只能在這里,如果你輸入其他的值,比如-30,那么系統會自動調整為-20。
示例:nice –20 我的程序,修改“我的程序”的優先級別為-20,。注意,參數是“–20”,有兩個橫杠,第二個橫杠代表負,第一個橫杠代表參數。
修改一個正在運行的程序的優先級別:renice
修改的程序可以正在運行
用法:renice -n 程序,-n是一個參數
示例:renice -5 我的程序,“我的程序”正在運行,修改他的優先級別為-5。這里的-n是一個參數,-5表示負五,并不是五。
動態的去查看進程:top
剛才說過,ps命令是生成一個當前進程的快照,意為只是那一個時刻進程的狀態,top命令同樣會產生一組進程列表,但是他會定時刷新這組列表,盡量反映最新的進程狀態,并且會報告一些進程概要。你可以想象一下Windows下的Ctrl+Alt+Delete
top命令執行后,上方會顯示一個進程的概要

概要中比較明顯的數值就不一一說明了,但是要看一下那個叫load average的值,他直譯過來可以叫做平均負載,他有三個值,這反映了系統最后60s,最后5分鐘和最后15分鐘內等待運行進程的個數,他可以反映系統忙碌的程度,如果這個值小于1.0,那么說明系統不忙碌。
CPU相關的百分比,man給出了一個說明,注意其中是否友好的進程,其實是代表了優先級高與低的進程。

查看被暫停的或者后臺任務的狀態:jobs
要說明這個命令,我們需要先知道讓一個命令后臺執行的方法。除了系統的進程以服務的形式在運行之外,我們可以使用&符號來指明一個命令后臺運行,通常他可能是一個耗時的操作,比如備份,大范圍搜索等。
示例:find / -name [a*]>~/res.txt &
我們把“&”符號連接在一個命令的后面,使得他變為后臺運行,同時,我們使用jobs命令來查看他們,他可能會是這樣

我們可以使用fg和bg命令來控制進程在前后臺的切換,比如我們將一個搜索放在后臺執行,在他沒有完成之前,通過jobs查看,它會顯示running狀態,此時,我們通過“fg jobs編號”命令可以把后臺正在運行的進程切換到前臺來執行。
進程的控制:kill
是的,就是這么直白!干掉他!當然,這也是kill命令最常用的作用,終止一個進程。
示例:kill 進程id,當我們通過ps或者top發現我們需要操作的進程之后,我們可以使用kill命令來終止相應pid的進程,注意,我這里說的是終止,并不是像命令所說的那樣殺死,因為kill能做的遠不止終止一個進程。我們通過kill -l可以查看我們可以發送哪些信號給當前進程。

我們看到,這里有很多“信號”,在我們使用“kill PID”的時候,實際上市使用的“kill -15 PID”,-15是kill對一個進程發出的默認信號,它代表終止,但是有時候,這種手段并不管用,那么我們需要使用kill -9來終止一個進程,從圖中我們可以看出,-9代表kill,它意味著真正的殺死一個進程。
因為進程的不同,從而導致了進程接收到終止信號后產生的行為也不同,有些能夠乖乖的終止,但有些不能。聽話的進程在接收到-15(終止信號)后會做一些善后處理之后終止,而那些不聽好的或許不予理睬,那么此時我們需要-9(殺死信號)來終止進程,但是這個信號發出之后就相當于一棍打死,沒有給進程余地來善后,所以這也是終止進程的殺手锏。
根據名字終止進程:killall
和kill類似,都能夠終止進程,但是killall能夠根據進程的名稱來終止一個或者一組進程
示例:killall httpd,終止所有httpd進程,當然,你需要root權限才能終止其他用戶的進程
一些其他的操作
*終止一個正在運行的程序:Ctrl+c,注意,c是cancel,不是copy
*掛起(暫停)一個正在運行的程序:Ctrl+z