7.1 Process
7.1.1 What is a process?
每個 process 都會有個獨一無二的 PID,而 parent process ID(PPID) 則為 PID 的父程序所擁有的 ID;process 可透過 fork
的方式產生 child process,而這些 child process 則會繼承 parent process 的 security identifiers, file descriptors, port, resource privileges, 環境變數….等等,整個 process lifeycle 可以參考下圖:
在 RHEL7 中,所有的 process 都是 systemd(1) 的 child process。
7.1.2 Process States
狀態 | Flag | kernel-defined state and description |
---|---|---|
Running | R | **TASK_RUNNING**:正在等待執行 or 正在執行的 process,正在執行的又包含執行 user routine & kernel routine(system calls)。例如:Data -> Memory |
Sleeping | S | **TASK_INTERRUPTIBLE**:等待特定的情況(硬體要求、系統資源存取、信號….等)發生,當條件滿足時就會回到 Running 的狀態 |
Sleeping | D | TASK_UNINTERRUPTIBLE**:與 **S 類似,但不會回應從其他地方送來的信號。例如:寫資料到外接儲存裝置時(Memory -> USB) |
Sleeping | K | TASK_KILLABLE**:與 **D 相反,可以接收來自其他地方的信號,例如:掛載網路磁碟機 |
Stopped | T | **TASK_STOPPED**:可能因為 user 或是其他 process 送來訊號而進入 Stopped 狀態,也可能因為特定訊號而返回 Running 狀態 |
Stopped | T | **TASK_TRACED**:同上,但可 debug |
Zombie | Z | **EXIT_ZOMBIE**:已通知 parent process 準備離開後的狀態,除了 process identity 之外的資源都會被釋放 |
Zombie | X | **EXIT_DEAD**:所有資源都被釋放,ps 也看不見了 |
7.1.2 Listing processes
ps 指定常用的參數:
aux
las
afx
(含階層)-O
(指定要顯示的欄位)--sort
:排序
ps
可用來觀察目前 process 的狀態,有以下幾種格式
UNIX(POSIX):參數加上一個
-
BSD:參數不加上
-
GNU long:參數加上兩個
-
1 | # BSD |
檢視全部的 process 常用 aux
選項 or alx
(較為詳細),若想要檢視 process 之間的父子關係可使用 afx
(關鍵是 f
參數)
關於 ps 還有幾個重點:
- 若 ps 不加上任何參數,就僅會顯示與目前這個 user terminal 有關係的 process:
1 | [student@server0 ~]$ ps |
- 顯示結果中,若是以 [ ] 包覆的,表示為 kernel thread
1 | [student@server0 ~]$ ps aux |
透過
ps afx
orpstree
可看到 process 之間的 parent/child 關係若要排序 ps 出來的結果,可透過
--sort
選項 (參考網址(Linux process memory usage - how to sort the ps command))
1 | # 根據 CPU 遞增排序 |
7.2 Controlling Jobs
jobs
指令只會顯示目前 session 中的 job
1 | $ gedit & |
7.2.1 Jobs and sessions
當 terminal or console 被開啟時,會產生一個 process session,所以透過同一個 terminal or console 產生出來的 process,都會使用相同的 session ID,而每個 session 中,一次只能有一個 process 在前景執行。
service daemon 或是 kernel process thread 在 ps
出來的結果中,TTY
欄位會以 ?
來呈現,因為此類的 background process 並沒有 controlling terminal。
7.2.2 Running jobs in the background
Ctrl + z
:可送出 suspend 要求,用來讓 process 進入 Stopped 狀態(T)
Ctrl + c
:中斷 process 執行
bg %JOB_ID
:可讓 process 恢復執行。
1 | # 一個執行中的範例 |
7.3 Killing Processes
7.3.1 Process control using signals
signal 是送到 process 的一種軟體型式的中斷,有以下幾種:
Signal number | Short name | Definition | Purpose |
---|---|---|---|
1 |
HUP |
Hangup | |
2 |
INT |
Keyboard interrupt | 讓程式中止,等同按下 Ctrl + c |
3 |
QUIT |
Keyboard quit | 讓 process 中止,但會執行 core dump 的動作,等同按下 Ctrl + \ |
9 |
KILL |
Kill, unblockable | 強行中止 |
15 (default) |
TERM |
Terminate | 通知程式中止,允許 process 完成 self-cleanup 後才中止 |
20 |
TSTP |
Keyboard stop | 讓 process 中斷執行(但可恢復),效果等同按下 Ctrl + z |
詳細的 signal 列表可使用
kill -l
查詢
基本上砍掉 process 時先嘗試用
SIGTERM
,不行的話才改用SIGKILL
,會是比較穩妥的作法‧
沒指定 SIG 則預設給 SIGTERM(15)
Logging users out administratively
w
指令是用來檢視目前登入到系統的使用者以及累積到現在的資源使用狀況:
1 | [kiosk@foundation0 ~]$ w -f |
pkill
是個強大的關閉 process 的指令,可透過以下方式過濾:
- command
- UID
- GID
- parent
- terminal
pgrep
指定 user 作 grep
1 | # 刪除使用者 bboop 相關的 process |
1 | [student@server0 ~]$ sleep 1000 & |
7.4 Monitoring Process Activity
7.4.1 Load average
靜態呈現,使用 w -f
or uptime
:
1 | # 查詢目前系統的 load average |
load average 超過 1 就表示系統負擔過重(要先除以 CPU 執行緒數量)
7.4.2 Real-time process monitoring
動態呈現,使用 top
:
VIRT
:process 消耗所有記憶體大小(包含實體 & 虛擬),等同 ps 指令中的VSZ
RES
:process 所使用的實體記憶體大小,等同 ps 指令中的RSS
在 top 中常用的按鍵:
Key | Purpose |
---|---|
l , t , m |
開啟 or 關閉 load, thread, memory 資訊 |
M |
記憶體使用量從大排到小 |
P |
CPU 使用量從大排到小 |
k |
指定 PID 並 TERM 該 process |
r |
renice 指定 process |
W |
記錄目前的 top 觀察設定,並可作為下次使用 top 時的預設設定 |
B |
header & running process 會以粗體顯示 |