進程管理與SELinux

 
進程(process):
 
將程序與進程的總結:
 程序 (program):一般爲 binary program ,放置在儲存媒體中 (如硬盤、光盤、軟盤、磁帶等), 爲實體文
件的型態存在;
進程 (process):程序被觸發後,執行者的權限與屬性、程序的程序代碼與所需數據等都會被加載內存中, 操做系統並給予這個內存內的單元一個標識符 (PID),能夠說,進程就是一個正在運做中的程序。
 
在 Linux 的進程呼叫一般稱爲 fork-and-exec 的流程!進程都會藉由父進程以複製 (fork) 的方式產生一個如出一轍的子進程(會多一個PPID), 而後被複製出來的子進程再以 exec 的方式來執行實際要進行的程序,最終就成爲一個子進程的存在。
好比,登入 bash 以後, 就是取得一個名爲 bash 的 PID ,而在這個環境底下所執行的其餘指令,就幾乎都是所謂的子進程。
 
常駐在內存當中的進程一般都是負責一些系統所提供的功能以服務用戶各項任務,所以這些常駐程序就會被咱們稱爲:服務 (daemon)。好比,系統每分鐘掃描 /etc/crontab 以及相關的配置文件,是由crond這個程序所提供的服務。通常 daemon 類型的程序都會加上 d 在文件名後頭,d 表明的就是daemon 的意思。
 
在 Linux 當中,默認提供了六個文字界面登入窗口,以及一個圖形界面,你可使用 [Alt]+[F1].....[F7]來切換不一樣的終端機界面,並且每一個終端機界面的登入者還能夠不一樣人!
Linux能夠在任什麼時候候,將某個被困住的進程殺掉,而後再從新執行該進程而不用從新啓動!幾乎能夠說絕對不會當機。
 

 
工做管理(job control):
 
要進行 bash 的 job control 必需要注意到的限制:
 這些工做所觸發的進程必須來自於你 shell 的子進程(只管理本身的 bash);
 前景:你能夠控制與下達指令的這個環境稱爲前景的工做 (foreground);
 背景:能夠自行運做的工做,在終端機模式下你沒法使用 [ctrl]+c 終止他,可以使用 bg/fg 呼叫該工做;
 工做管理的背景依舊與終端機有關。若是你想要讓在背景的工做在你註銷後還可以繼續的執行,那麼使用 nohup 搭配 & 是不錯的運做情境。nohup必需要是外部指令才行。
 背景中『執行』的進程不能等待 terminal/shell 的輸入(input)
 
進行 job 控制的指令:
 
 直接將指令丟到背景中『執行』的 &
 
    在背景當中執行的指令,若是有 stdout 及 stderr 時,他的數據依舊是輸出到屏幕上面。可利用數據流重導向, 將輸出數據傳送至某個文件中。
 
 將『目前』的工做丟到背景中『暫停』:[ctrl]-z
 
在預設的狀況下,使用 [ctrl]-z 丟到背景當中的工做都是『暫停』的狀態。
 
 觀察目前的背景工做狀態: jobs
 
列出目前有多少的工做在背景當中。
bash 會給予這個指令一個『工做號碼(job number)』,就是那個 [1]。後面 14566 則是該指令所觸發的『 PID 』。
+ 表明最近被放到背景的工做號碼, - 表明最近最後第二個被放置到背景中的工做號碼。 而超過最後第三個之後的工做,就不會有 +/- 符號存在。
 
 將背景工做拿到前景來處理:fg(foreground)
 
 
或者 fg [+|-]
 
 讓工做在背景下的狀態變成運做中: bg
 
bg %jobnumber
 
 管理背景當中的工做: kill
 
kill 後面接的數字默認會是 PID ,若是想要管理 bash 的工做控制,就得要加上 %數字。
 

 
進程管理:
 
 進程的觀察
 
利用靜態的 ps或者是動態的 top,還能以 pstree 來查閱進程樹之間的關係。
 
ps :將某個時間點的進程運做狀況擷取下來
一個是隻能查閱本身 bash 進程的『 ps -l 』,一個則是能夠查閱全部系統運做的進程『 ps aux 』
 
o 僅觀察本身的 bash 相關進程: ps -l
 
字段
說明
F
表明這個進程旗標 (process flags),說明這個進程的總結權限,常見號碼有:
 若爲 4 表示此進程的權限爲 root ;
 若爲 1 則表示此子進程僅進行復制(fork)而沒有實際執行(exec)。
S
表明這個進程的狀態 (STAT),主要的狀態有:
 R (Running):該程序正在運做中;
 S (Sleep):該程序目前正在睡眠狀態(idle),但能夠被喚醒(signal)。
 D :不可被喚醒的睡眠狀態,一般這支程序可能在等待 I/O 的狀況(ex>打印)
 T :中止狀態(stop),多是在工做控制(背景暫停)或除錯 (traced) 狀態;
 Z (Zombie):殭屍狀態,進程已經終止但卻沒法被移除至內存外。
UID/PID/PPID
表明『此進程被該 UID 所擁有/進程的 PID 號碼/此進程的父進程 PPID 號碼』
C
表明 CPU 使用率,單位爲百分比
PRI/NI
Priority/Nice 的縮寫,表明此進程被 CPU 所執行的優先級,數值越小表明該進程越快被 CPU 執行。
ADDR/SZ/WCHAN
都與內存有關,
ADDR 是 kernel function,指出該進程在內存的哪一個部分,若是是個running 的進程,通常就會顯示『 - 』。  
SZ 表明此進程用掉多少內存。  
WCHAN 表示目前進程是否運做中,一樣的, 若爲 - 表示正在運做中。
TTY
登入者的終端機位置,若爲遠程登陸則使用動態終端接口 (pts/n)
TIME
使用掉的 CPU 時間,注意,是此進程實際花費 CPU 運做的時間,而不是系統時間
CMD
形成此進程的觸發程序之指令爲什麼
 
o 觀察系統全部進程: ps aux
 
 
 
字段
說明
USER
該 process 屬於那個使用者帳號的
PID
該 process 的進程標識符
%CPU
該 process 使用掉的 CPU 資源百分比
%MEM
該 process 所佔用的物理內存百分比
VSZ
該 process 使用掉的虛擬內存量 (Kbytes)
RSS
該 process 佔用的固定的內存量 (Kbytes)
TTY
該 process 是在那個終端機上面運做,若與終端機無關則顯示 ?,另外, tty1-tty6 是本機上面的登入者進程,若爲 pts/0 等等的,則表示爲由網絡鏈接進主機的進程。
STAT
該進程目前的狀態,狀態顯示與 ps -l 的 S 旗標相同 (R/S/T/Z)
START
該 process 被觸發啓動的時間
TIME
該 process 實際使用 CPU 運做的時間
COMMAND
該進程的實際指令爲什麼
一般,形成 殭屍進程的成因是由於該進程應該已經執行完畢,或者是因故應該要終止了, 可是該進程的父進程卻沒法完整的將該進程結束掉,而形成那個進程一直存在內存當中。 若是你發如今某個進程的 CMD 後面還接<defunct> 時,就表明該進程是殭屍進程啦。
 
 
 top:動態觀察進程的變化
 
在預設的狀況下,每次更新進程資源的時間爲 5 秒。
 
整個系統的資源使用狀態,基本上總共有六行。
 
行數
解釋
top...
o 目前的時間,亦便是 00:53:59 那個項目;
o 開機到目前爲止所通過的時間,亦便是 up 6:07, 那個項目;
o 已經登入系統的用戶人數,亦便是 3 users, 項目;
o 系統在 1, 5, 15 分鐘的平均工做負載。表明的是 1, 5, 15 分鐘,系統平均要負責運做幾個進程(工做)的意思。 越小表明系統越閒置,若高於 1 得要注意你的系統進程是否太過繁複了!
Task...
顯示的是目前進程的總量與個別進程在什麼狀態(running, sleeping, stopped, zombie)。 比較須要注意的是最後的 zombie 那個數值,若是不是 0 !好好看看究竟是那個 process 變成殭屍了
%Cpus...
顯示的是 CPU 的總體負載,每一個項目可以使用 ? 查閱。須要特別注意的是 wa 項目,那個項目表明的是 I/O wait, 一般你的系統會變慢都是 I/O 產生的問題比較大!所以這裏得要注意這個項目耗用 CPU 的資源喔! 另外,若是是多核心的設備,能夠按下數字鍵『1』來切換成不一樣 CPU 的負載率。
第4、五行
表示目前的物理內存與虛擬內存 (Mem/Swap) 的使用狀況。 再次重申,要注意的是 swap的使用量要儘可能的少!若是 swap 被用的很大量,表示系統的物理內存實在不足!
第六行
是當在 top 程序當中輸入指令時,顯示狀態的地方。
 
 
 pstree
 
 
由 pstree 的輸出能夠很清楚的知道,全部的進程都是依附在 systemd 這支進程底下的! 仔這支進程的 PID 是1號!由於他是由 Linux 核心所主動呼叫的第一支程序!
 

 
 進程的管理
 
進程是如何互相管理的呢?實際上是透過給予該進程一個訊號 (signal) 去告知該進程你想要讓她做什麼!
 
 
更多的訊號信息請自行 man 7 signal,只要記得『1, 9, 15』這三個號碼的意義便可。
 
透過 kill 或 killall 傳送一個訊號給某個進程。
 
 kill -signal PID
 
一般 kill 都會配合 ps, pstree 等指令。
若是將來你想要將某個莫名其妙的登入者的聯機刪除的話,就能夠透過使用pstree -p 找到相關進程, 而後再以 kill -9 將該進程刪除,該條聯機就會被踢掉。
 
 killall -signal  指令名稱
 
 
如,強制終止全部以 httpd 啓動的進程 killall -9 httpd
 
總之,要刪除某個進程,咱們可使用 PID 或者是啓動該進程的指令名稱, 而若是要刪除某個服務呢?呵呵!最簡單的方法就是利用 killall , 由於他能夠將系統當中全部以某個指令名稱啓動的進程所有刪除。
 
 

 
 進程的執行順序
 
Linux 給予進程一個所謂的『優先執行序 (priority, PRI)』,這個 PRI 值越低表明越優先的意思。不過這個 PRI 值是由核心動態調整的,用戶沒法直接調整 PRI值的。
 
 
PRI 是核心動態調整的,用戶也無權去幹涉 PRI !若是想要調整進程的優先執行序時,得要透過 Nice 值!Nice 值就是上表的 NI !
 
PRI(new) = PRI(old) + nice
 
若是本來的 PRI 是 50 ,並非給予一個 nice = 5 ,就會讓 PRI 變成 55! 由於 PRI 是系統『動態』決定的,因此,雖然 nice 值是能夠影響 PRI ,不過, 最終的 PRI 還是要通過系統分析後纔會決定的。
 
注意:
 nice 值可調整的範圍爲 -20 ~ 19 ;
 root 可隨意調整本身或他人進程的 Nice 值,且範圍爲 -20 ~ 19 ;
 通常使用者僅可調整本身進程的 Nice 值,且範圍僅爲 0 ~ 19 (避免通常用戶搶佔系統資源);
 通常使用者僅可將 nice 值越調越高,例如原本 nice 爲 5 ,則將來僅能調整到大於 5;
 
 
如何給予某個進程 nice 值?有兩種方式,分別是:
 
 一開始執行程序就當即給予一個特定的 nice 值:用 nice 指令;
 
一般何時要將 nice 值調大呢?舉例來講,系統的背景工做中, 某些比較不重要的進程之進行:例如備份工做!因爲備份工做至關的耗系統資源, 這個時候就能夠將備份的指令之 nice 值調大一些,可使系統的資源分配的更爲公平!
 
 調整某個已經存在的 PID 的 nice 值:用 renice 指令。
 
整個 nice 值是能夠在父進程 --> 子進程之間傳遞的呢! 另外,除了 renice 以外,top 指令一樣的也是能夠調整 nice 值!
 
 

 
 系統資源的觀察
 
top 能夠看到不少系統的資源。
 
 free :觀察內存使用狀況
 
Mem 那一行顯示的是物理內存的量, Swap 則是內存置換空間的量。 total 是總量, used 是已被使用的量, free 則是剩餘可用的量。 後面的 shared/buffers/cached 則是在已被使用的量當中,用來做爲緩衝及快取的量,這些 shared/buffers/cached 的用量中,在系統比較忙碌時,能夠被釋出而繼續利用!所以後面就有一個 available (可用的) 數值!
 
Linux 系統爲了要加速系統效能,因此會將最常使用到的或者是最近使用到的文件數據快取 (cache) 下來, 這樣將來系統要使用該文件時,就直接由內存中搜尋取出,而不須要從新讀取硬盤,速度上面固然就加快了! 所以,物理內存被用光是正常的!
 
 uname:查閱系統與核心相關信息
 
相關文章
相關標籤/搜索