文章目錄
本文是循序漸進學運維-基礎篇系列的第44篇文章
本文我們主要來探討Linux下的進程,如果對你有幫助歡迎點贊收藏。
Linux進程
1. 進程的概念
Linux當中有很多用戶,每個用戶都可以同時運行多個程序,靠程序名來記憶每個程序,顯然不是一個好辦法。 Linux當中爲了區分每一個運行的程序,給沒給進程做了一個標識,這個標識我們叫他進程號(process ID) ,就像一個ip地址一樣,通過進程號來辨別每個進程。
操作系統給每個用戶賦予了權限,用戶可以控制自己的進程,比如分配不同的優先級,終止和啓動進程等。
進程一般由四個部分組成:
- 已分配的內存地址空間
- 安全屬性,包括所有權憑據和特權
- 程序代碼的一個或者多個執行進程
- 進程的狀態
進程的狀態一般有三種:
- 就緒狀態
- 執行狀態
- 阻塞狀態
三種狀態的轉換如圖:
簡單瞭解了進程之後,我們來看看進程的屬性:
2. 進程的屬性
進程ID(PID) : 這是用來區分進程的唯一標識
父進程的ID : PPID
進程的狀態: 運行(R),休眠(s)和殭屍(z)
centos6 系統啓動後的第一個進程是init, PID 是1.
centos7 PID 爲1的進程是systemd
3. 關於殭屍進程
殭屍進程: 一個進程使用fork創建子進程後,如果子進程退出,而父進程並沒有調用wait或waitpid獲取子進程的狀態信息,那麼子進程的進程描述仍然保存在系統中。這種進程就是殭屍進程。
任何一個子進程(init除外) 在exit() 之後,並非馬上消失,而是留下一個稱之爲殭屍進程的數據結構,等待父進程處理。如果這時候父進程沒有來的及處理,我們用ps命令就會看到大寫的Z的進程。 如果子進程結束前,父進程已經退出,這時候的子進程由init接管。 init會以父進程的身份對殭屍進程進行處理。
Linux管理的基本命令
1. ps命令
1) 常用參數:
選項 | 作用 |
---|---|
a | 顯示現行終端機下的所有進程,包括其他用戶的進程; |
u | 顯示進程擁有者、狀態、資源佔用等的詳細信息(注意有“-”和無“-”的區別); |
x | 顯示沒有控制終端的進程。通常與 a 這個參數一起使用,可列出較完整信息; |
e | 顯示所有進程; |
f | 完整輸出顯示進程之間的父子關係; |
l | 較長、較詳細的將該 PID 的的信息列出; |
o | 自定義顯示的字段; |
2)常用組合
a) ps -aux
注: 最後一列[xxxx] 使用方括號括起來的進程是內核態的進程。 沒有括起來的是用戶態進程
b) ps-uax輸出的各個參數的含義如圖:
參數 | 含義 |
---|---|
USER: | 啓動這些進程的用戶 |
PID | 進程的ID |
%CPU | 進程佔用的CPU百分比; |
%MEM | 佔用內存的百分比; |
VSZ | 進程佔用的虛擬內存大小(單位:KB) |
RSS | 進程佔用的物理內存大小(單位:KB) |
STAT | 該程序目前的狀態 |
START | 該 process 被觸發啓動的時間; |
TIME | process 實際使用 CPU 運作的時間。 |
COMMAND | 該程序的實際指令 |
c) Linux進程有5種基本狀態:
R |該程序目前正在運作,或者是可被運作;
S |該程序目前正在睡眠當中 (可說是 idle 狀態啦!),但可被某些訊號(signal) 喚醒。
T |該程序目前正在偵測或者是停止了;
Z |該程序應該已經終止,但是其父程序卻無法正常的終止他,造成 zombie (疆屍) 程序的狀態
D |不可中斷狀態.
除了這5中狀態外還有一些延伸的狀態:
可以看到在S後面還有個小s, 或者有< 這類的拓展狀態 ,這些標記表示:
符號 | 含義 |
---|---|
< | 表示進程運行在高優先級上 |
N: | 表示進程運行在低優先級上 |
L: | 表示進程有頁面鎖定在內存中 |
s | 表示進程是控制進程 |
l: | 表示進程是多線程的 |
+: | 表示當前進程運行在前臺 |
3) 舉例
a) 進程狀態查看
打開一個進程:
在另一個終端查看:
注: 此處顯示的是S,睡眠狀態,+表示在前臺。 意思是 在前臺睡眠狀態。如果我們把他調到後臺運行會怎麼樣呢?
查詢結果爲T: T表示出於停止狀態
b) ps的使用方法 -ef
ps -ef
-e 顯示所有進程
-f 顯示完整格式輸出
此處包含的信息和ps -aux 不同,我們來看一下具體的含義:
參數 | 含義 |
---|---|
UID | 啓動這些進程的用戶 |
PID | 進程的ID |
PPID | 父進程的進程號 |
C | 進程生命週期中的CPU利用率 |
STIME: | 進程啓動時的系統時間 |
TTY | 表明進程在哪個終端設備上運行。如果顯示 ?表示與終端無關,這種進程一般是內核態進程。另外, tty1-tty6 是本機上面的登入者程序,若爲 pts/0 等,則表示運行在虛擬終端上的進程。 |
TIME: | 運行進程一共累計佔用的CPU時間 |
CMD: | 啓動的程序名稱 |
c) 根據cpu/內存來升序排序
[root@zmgaosh log]# ps -aux --sort pcpu |less
[root@zmgaosh log]# ps -aux --sort pmem |less
補充:
使用PS實時監控進程狀態
[root@zmgaosh log]# watch -n 1 ‘ps -aux --sort -pmem,-pcpu’
總結:
ps uax 和ps -ef 兩者的輸出結果差別不大,只是展示結果不同
aux是BSD風格, -ef是System風格, 更重要的是aux會截斷command列。
我是高勝寒,一個在教培行業不忘初心的人, 關注我,一起學習,歡迎點贊收藏,我們下篇文章再見!