Linux進(jìn)程管理方法介紹
一、簡(jiǎn)介
當(dāng)我們運(yùn)行程序時(shí),Linux會(huì)為程序創(chuàng)建一個(gè)特殊的環(huán)境,該環(huán)境包含程序運(yùn)行需要的所有資源,以保證程序能夠獨(dú)立運(yùn)行,不受其他程序的干擾。這個(gè)特殊的環(huán)境就稱為進(jìn)程。每個(gè) Linux 命令都與系統(tǒng)中的程序?qū)?yīng),輸入命令,Linux 就會(huì)創(chuàng)建一個(gè)新的進(jìn)程。例如使用 ls 命令遍歷目錄中的文件時(shí),就創(chuàng)建了一個(gè)進(jìn)程。簡(jiǎn)而言之,進(jìn)程就是程序的實(shí)例。
系統(tǒng)通過(guò)一個(gè)五位數(shù)字跟蹤程序的運(yùn)行狀態(tài),這個(gè)數(shù)字稱為 pid 或進(jìn)程ID。每個(gè)進(jìn)程都擁有唯一的 pid。
理論上,五位數(shù)字是有限的,當(dāng)數(shù)字被用完時(shí),下一個(gè) pid 就會(huì)重新開(kāi)始,所以 pid 最終會(huì)重復(fù)。但是,兩個(gè) pid 一樣的進(jìn)程不能同時(shí)存在,因?yàn)長(zhǎng)inux會(huì)使用 pid 來(lái)跟蹤程序的運(yùn)行狀態(tài)。
二、創(chuàng)建進(jìn)程
有兩種方式來(lái)創(chuàng)建進(jìn)程:前臺(tái)進(jìn)程和后臺(tái)進(jìn)程。
1、前臺(tái)進(jìn)程
默認(rèn)情況下,用戶創(chuàng)建的進(jìn)程都是前臺(tái)進(jìn)程;前臺(tái)進(jìn)程從鍵盤(pán)讀取數(shù)據(jù),并把處理結(jié)果輸出到顯示器。
我們可以看到前臺(tái)進(jìn)程的運(yùn)行過(guò)程。例如,使用 ls 命令來(lái)遍歷當(dāng)前目錄下的文件:
$ls ch*.doc ch01-1.doc ch010.doc ch02.doc ch03-2.doc ch04-1.doc ch040.doc ch05.doc
這個(gè)程序就運(yùn)行在前臺(tái),它會(huì)直接把結(jié)果輸出到顯示器。如果 ls 命令需要數(shù)據(jù)(實(shí)際上不需要),那么它會(huì)等待用戶從鍵盤(pán)輸入。
當(dāng)程序運(yùn)行在前臺(tái)時(shí),由于命令提示符($)還未出現(xiàn),用戶不能輸入其他命令;即使程序需要運(yùn)行很長(zhǎng)時(shí)間,也必須等待程序運(yùn)行結(jié)束才能輸入其他命令。
2、后臺(tái)進(jìn)程
后臺(tái)進(jìn)程與鍵盤(pán)沒(méi)有必然的關(guān)系。當(dāng)然,后臺(tái)進(jìn)程也可能會(huì)等待鍵盤(pán)輸入。
后臺(tái)進(jìn)程的優(yōu)點(diǎn)是不必等待程序運(yùn)行結(jié)束就可以輸入其他命令。
創(chuàng)建后臺(tái)進(jìn)程最簡(jiǎn)單的方式就是在命令的末尾加 &,例如:
$ls ch*.doc & ch01-1.doc ch010.doc ch02.doc ch03-2.doc ch04-1.doc ch040.doc ch05.doc ch06-2.doc ch01-2.doc ch02-1.doc
如果 ls 命令需要輸入(實(shí)際上不需要),那么它會(huì)暫停,直到用戶把它調(diào)到前臺(tái)并從鍵盤(pán)輸入數(shù)據(jù)才會(huì)繼續(xù)運(yùn)行。
三、查看正在運(yùn)行的進(jìn)程
可以使用 ps 命令查看進(jìn)程的運(yùn)行狀態(tài),包括后臺(tái)進(jìn)程,例如:
$ps PID TTY TIME CMD 18358 ttyp3 00:00:00 sh 18361 ttyp3 00:01:31 abiword 18789 ttyp3 00:00:00 ps
還可以結(jié)合 -f 選項(xiàng)查看更多信息,f 是 full 的縮寫(xiě),例如:
$ps -f UID PID PPID C STIME TTY TIME CMD amrood 6738 3662 0 10:23:03 pts/6 0:00 first_one amrood 6739 3662 0 10:22:54 pts/6 0:00 second_one amrood 3662 3657 0 08:10:53 pts/6 0:00 -ksh amrood 6892 3662 4 10:51:50 pts/6 0:00 ps -f
每列的含義如下:
- UID:進(jìn)程所屬用戶的ID,即哪個(gè)用戶創(chuàng)建了該進(jìn)程。
- PID:進(jìn)程ID。
- PPID:父進(jìn)程ID,創(chuàng)建該進(jìn)程的進(jìn)程稱為父進(jìn)程。
- C:CPU使用率。
- STIME:進(jìn)程被創(chuàng)建的時(shí)間。
- TTY:與進(jìn)程有關(guān)的終端類型。
- TIME:進(jìn)程所使用的CPU時(shí)間。
- CMD:創(chuàng)建該進(jìn)程的命令。
ps 命令還有其他一些選項(xiàng):
- -a:顯示所有用戶的所有進(jìn)程。
- -x:顯示無(wú)終端的進(jìn)程。
- -u:顯示更多信息,類似于 -f 選項(xiàng)。
- -e:顯示所有進(jìn)程。
四、終止進(jìn)程
當(dāng)進(jìn)程運(yùn)行在前臺(tái)時(shí),可以通過(guò) kill 命令或 Ctrl+C 組合鍵來(lái)結(jié)束進(jìn)程。
如果進(jìn)程運(yùn)行在后臺(tái),那么首先要通過(guò) ps 命令來(lái)獲取進(jìn)程ID,然后使用 kill 命令“殺死”進(jìn)程,例如:
$ps -f UID PID PPID C STIME TTY TIME CMD amrood 6738 3662 0 10:23:03 pts/6 0:00 first_one amrood 6739 3662 0 10:22:54 pts/6 0:00 second_one amrood 3662 3657 0 08:10:53 pts/6 0:00 -ksh amrood 6892 3662 4 10:51:50 pts/6 0:00 ps -f $kill 6738 Terminated
如上所示,kill 命令終結(jié)了 first_one 進(jìn)程。
如果進(jìn)程忽略 kill 命令,那么可以通過(guò) kill -9 來(lái)結(jié)束:
$kill -9 6738 Terminated
1.命令格式:
kill[參數(shù)][進(jìn)程號(hào)]
2.命令功能:
發(fā)送指定的信號(hào)到相應(yīng)進(jìn)程。不指定型號(hào)將發(fā)送SIGTERM(15)終止指定進(jìn)程。如果任無(wú)法終止該程序可用“-KILL” 參數(shù),其發(fā)送的信號(hào)為SIGKILL(9) ,將強(qiáng)制結(jié)束進(jìn)程,使用ps命令或者jobs 命令可以查看進(jìn)程號(hào)。root用戶將影響用戶的進(jìn)程,非root用戶只能影響自己的進(jìn)程。
3.命令參數(shù):
- -l 信號(hào),若果不加信號(hào)的編號(hào)參數(shù),則使用“-l”參數(shù)會(huì)列出全部的信號(hào)名稱
- -a 當(dāng)處理當(dāng)前進(jìn)程時(shí),不限制命令名和進(jìn)程號(hào)的對(duì)應(yīng)關(guān)系
- -p 指定kill 命令只打印相關(guān)進(jìn)程的進(jìn)程號(hào),而不發(fā)送任何信號(hào)
- -s 指定發(fā)送信號(hào)
- -u 指定用戶
注意:
- kill命令可以帶信號(hào)號(hào)碼選項(xiàng),也可以不帶。如果沒(méi)有信號(hào)號(hào)碼,kill命令就會(huì)發(fā)出終止信號(hào)(15),這個(gè)信號(hào)可以被進(jìn)程捕獲,使得進(jìn)程在退出之前可以清理并釋放資源。也可以用kill向進(jìn)程發(fā)送特定的信號(hào)。例如:
kill -2 123
它的效果等同于在前臺(tái)運(yùn)行PID為123的進(jìn)程時(shí)按下Ctrl+C鍵。但是,普通用戶只能使用不帶signal參數(shù)的kill命令或最多使用-9信號(hào)。 - kill可以帶有進(jìn)程ID號(hào)作為參數(shù)。當(dāng)用kill向這些進(jìn)程發(fā)送信號(hào)時(shí),必須是這些進(jìn)程的主人。如果試圖撤銷(xiāo)一個(gè)沒(méi)有權(quán)限撤銷(xiāo)的進(jìn)程或撤銷(xiāo)一個(gè)不存在的進(jìn)程,就會(huì)得到一個(gè)錯(cuò)誤信息。
- 可以向多個(gè)進(jìn)程發(fā)信號(hào)或終止它們。
- 當(dāng)kill成功地發(fā)送了信號(hào)后,shell會(huì)在屏幕上顯示出進(jìn)程的終止信息。有時(shí)這個(gè)信息不會(huì)馬上顯示,只有當(dāng)按下Enter鍵使shell的命令提示符再次出現(xiàn)時(shí),才會(huì)顯示出來(lái)。
- 應(yīng)注意,信號(hào)使進(jìn)程強(qiáng)行終止,這常會(huì)帶來(lái)一些副作用,如數(shù)據(jù)丟失或者終端無(wú)法恢復(fù)到正常狀態(tài)。發(fā)送信號(hào)時(shí)必須小心,只有在萬(wàn)不得已時(shí),才用kill信號(hào)(9),因?yàn)檫M(jìn)程不能首先捕獲它。要撤銷(xiāo)所有的后臺(tái)作業(yè),可以輸入kill 0。因?yàn)橛行┰诤笈_(tái)運(yùn)行的命令會(huì)啟動(dòng)多個(gè)進(jìn)程,跟蹤并找到所有要?dú)⒌舻倪M(jìn)程的PID是件很麻煩的事。這時(shí),使用kill 0來(lái)終止所有由當(dāng)前shell啟動(dòng)的進(jìn)程,是個(gè)有效的方法。
信號(hào)說(shuō)明:
只有第9種信號(hào)(SIGKILL)才可以無(wú)條件終止進(jìn)程,其他信號(hào)進(jìn)程都有權(quán)利忽略。 下面是常用的信號(hào):
- HUP 1 終端斷線
- INT 2 中斷(同 Ctrl + C)
- QUIT 3 退出(同 Ctrl + \)
- TERM 15 終止
- KILL 9 強(qiáng)制終止
- CONT 18 繼續(xù)(與STOP相反, fg/bg命令)
- STOP 19 暫停(同 Ctrl + Z)
五、父進(jìn)程和子進(jìn)程
每個(gè) Linux 進(jìn)程會(huì)包含兩個(gè)進(jìn)程ID:當(dāng)前進(jìn)程ID(pid)和父進(jìn)程ID(ppid)。可以暫時(shí)認(rèn)為所有的進(jìn)程都有父進(jìn)程。
由用戶運(yùn)行的大部分命令都將 Shell 作為父進(jìn)程,使用 ps -f 命令可以查看當(dāng)前進(jìn)程ID和父進(jìn)程ID。
六、僵尸進(jìn)程和孤兒進(jìn)程
正常情況下,子進(jìn)程被終止時(shí)會(huì)通過(guò) SIGCHLD 信號(hào)通知父進(jìn)程,父進(jìn)程可以做一些清理工作或者重新啟動(dòng)一個(gè)新的進(jìn)程。但在某些情況下,父進(jìn)程會(huì)在子進(jìn)程之前被終止,那么這些子進(jìn)程就沒(méi)有了“父親”,被稱為孤兒進(jìn)程。
init 進(jìn)程會(huì)成為所有孤兒進(jìn)程的父進(jìn)程。init 的 pid 為1,是Linux系統(tǒng)的第一個(gè)進(jìn)程,也是所有進(jìn)程的父進(jìn)程。
如果一個(gè)進(jìn)程被終止了,但是使用 ps 命令仍然可以查看該進(jìn)程,并且狀態(tài)為 Z,那么這就是一個(gè)僵尸進(jìn)程。僵尸進(jìn)程雖然被終止了,但是仍然存在于進(jìn)程列表中。一般僵尸進(jìn)程很難殺掉,你可以先殺死他們的父進(jìn)程,讓他們變成孤兒進(jìn)程,init 進(jìn)程會(huì)自動(dòng)清理僵尸進(jìn)程。
七、常駐進(jìn)程
常駐進(jìn)程一般是系統(tǒng)級(jí)進(jìn)程,以 root 權(quán)限運(yùn)行在后臺(tái),可以處理其他進(jìn)程的請(qǐng)求。
常駐進(jìn)程沒(méi)有終端,不能訪問(wèn) /dev/tty 文件,如果使用 ps -ef 查看該進(jìn)程,tty 這一列會(huì)顯示問(wèn)號(hào)(?)。
更確切地說(shuō),常駐進(jìn)程通常運(yùn)行在后臺(tái),等待指定事件發(fā)生,例如打印進(jìn)程是一個(gè)常駐進(jìn)程,它會(huì)等待用戶輸入打印相關(guān)的命令并進(jìn)行處理。
八、top命令
top 命令是一個(gè)很有用的工具,它可以動(dòng)態(tài)顯示正在運(yùn)行的進(jìn)程,還可以按照指定條件對(duì)進(jìn)程進(jìn)行排序,與Windows的任務(wù)管理器類似。
top 命令可以顯示進(jìn)程的很多信息,包括物理內(nèi)存、虛擬內(nèi)存、CPU使用率、平均負(fù)載以及繁忙的進(jìn)程等。例如:
$top
九、任務(wù)和進(jìn)程
任務(wù)(task)是最抽象的,是一個(gè)一般性的術(shù)語(yǔ),指由軟件完成的一個(gè)活動(dòng)。一個(gè)任務(wù)既可以是一個(gè)進(jìn)程,也可以是多個(gè)進(jìn)程。簡(jiǎn)而言之,它指的是一系列共同達(dá)到某一目的的操作。例如,讀取數(shù)據(jù)并將數(shù)據(jù)放入內(nèi)存中。這個(gè)任務(wù)可以由一個(gè)進(jìn)程來(lái)實(shí)現(xiàn),也可以由多個(gè)進(jìn)程來(lái)實(shí)現(xiàn)。 每個(gè)任務(wù)都有一個(gè)數(shù)字表示的任務(wù)號(hào)。
進(jìn)程(process)常常被定義為程序的執(zhí)行。可以把一個(gè)進(jìn)程看成是一個(gè)獨(dú)立的程序,在內(nèi)存中有其完備的數(shù)據(jù)空間和代碼空間。一個(gè)進(jìn)程所擁有的數(shù)據(jù)和變量只屬于它自己。
jobs 命令可以用來(lái)查看系統(tǒng)中正在運(yùn)行的任務(wù),包括后臺(tái)運(yùn)行的任務(wù)。該命令可以顯示任務(wù)號(hào)及其對(duì)應(yīng)的進(jìn)程ID。一個(gè)任務(wù)可以對(duì)應(yīng)于一個(gè)或者多個(gè)進(jìn)程號(hào)。
jobs 命令的 -l 選項(xiàng)可以查看當(dāng)前任務(wù)包含的進(jìn)程ID:
$jobs -l [1] + 1903 running ls ch*.doc & $
其中,第一列表示任務(wù)號(hào),第二列表示任務(wù)對(duì)應(yīng)的進(jìn)程ID,第三列表示任務(wù)的運(yùn)行狀態(tài),第四列表示啟動(dòng)任務(wù)的命令。
十、前臺(tái)任務(wù)和后臺(tái)任務(wù)的切換
1、fg 命令可以將后臺(tái)任務(wù)調(diào)到前臺(tái),語(yǔ)法為:
$fg %jobnumber
jobnumber 是通過(guò) jobs 命令獲取的后臺(tái)任務(wù)的的序號(hào),注意不是pid。如果后臺(tái)只有一個(gè)任務(wù),可以不指定 jobnumber。
2、bg 命令可以將后臺(tái)暫停的任務(wù),調(diào)到前臺(tái)繼續(xù)運(yùn)行,語(yǔ)法為:
$bg %jobnumber
jobnumber 同樣是通過(guò) jobs 命令獲取的后臺(tái)任務(wù)的的序號(hào),注意不是pid。如果前臺(tái)只有一個(gè)任務(wù),可以不指定 jobnumber。
如果希望將當(dāng)前任務(wù)轉(zhuǎn)移到后臺(tái),可以先 Ctrl+z 暫停任務(wù),再使用 bg 命令。任務(wù)轉(zhuǎn)移到后臺(tái)可以空出終端,繼續(xù)輸入其他命令。
到此這篇關(guān)于Linux進(jìn)程管理的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
數(shù)據(jù)結(jié)構(gòu) 二叉樹(shù)的遞歸與非遞歸
這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu) 二叉樹(shù)的遞歸與非遞歸的相關(guān)資料,需要的朋友可以參考下2017-05-05linux shell(.sh)腳本編寫(xiě)和運(yùn)行入門(mén)
這篇文章主要介紹了linux shell(.sh)腳本編寫(xiě)和運(yùn)行入門(mén),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09Shell之function函數(shù)的定義及調(diào)用示例
本文主要介紹了Shell之function函數(shù)的定義及調(diào)用示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08linux系統(tǒng)mysql自動(dòng)備份并使用ftp上傳的方法
這篇文章主要介紹了linux系統(tǒng)自動(dòng)導(dǎo)出mysql備份,并上傳到指定ftp,還可以刪除舊的備份文件,大家參考使用吧2014-01-01