第六章 管理執行中的處理程序
Linux 是一種多使用者的作業系統,也是一種多工系統。多工意味著可以同時執行多個程式,執行程式的實例通常被稱為處理程序 (process)。
可透過 shell 啟動、暫停、停止或刪除處理程序,還可將處理程序放到背景以及帶到前景。
6.1 理解處理程序
處理程序是指令的執行實例。系統中的處理程序透過一個處理程序 ID (PID) 進行識別,PID 相對於當前系統是唯一的。除了 PID 號之外,處理程序還與一個特定的使用者帳號和群組帳號相關聯,有助於確定該處理程序可以存取哪些系統資源。
用來顯示處理程序相關資訊的指令主要從 /proc 檔案系統中儲存的原始數據獲取資訊。每個處理程序都在 /proc 的一個子目錄 (以該處理程序的 PID 命名) 中儲存了自己的資訊。
6.2 列出處理程序
使用 ps 指令或者 top 指令,其中 top 指令提供了一種更面向螢幕的方式列出處理程序。
6.2.1 使用 ps 指令列出處理程序
使用 ps u 可顯示使用者名稱以及其他資訊。
VSZ:虛擬記憶體大小 (Virtual Set Size) 顯示了映像處理程序的大小 (單位:KB)。
RSS:(Resident Set Size) 顯示了記憶體中程式的大小。
VSZ 是分配給處理程序的記憶體數量,RSS 是處理程序實際使用的記憶體數量 (表明了不能被交換的實體記憶體)。
STAT 欄:S 表示一個當前執行的處理程序,R 表示一個睡眠處理程序,+ 表示處理程序與前景操作相關聯。
查看當前使用者所有處理程序:ps ux | less
查看所有使用者處理程序:ps aux | less
也可以自訂輸出欄位,並且根據某一欄排序,例如:
| |
-e 為顯示每一個執行中的處理程序,-o 後為顯示的欄位,其中 comm 為指令,然後 --sort=-vsz 以 vsz 欄位從大到小排序。
6.2.2 使用 top 指令列出和更改處理程序
使用 top 指令,預設按處理程序當前所使用的 CPU 百分比排序來顯示處理程序。
top 指令可以完成的操作:
| 指令 | 描述 |
|---|---|
| h | 說明 |
| M | 按記憶體使用情況排序 |
| 1 | 切換顯示所有 CPU 使用情況 (系統有多個 CPU) |
| R | 反向排序 |
| u | 然後輸入使用者名稱可以顯示某使用者的處理程序 |
| r | 改變處理程序優先權 (nice 值) |
| k | 刪除處理程序 (kill 指令) |
6.2.3 使用 System Monitor 列出處理程序
GNOME 桌面的 GUI 工具。
6.3 管理背景和前景處理程序
對於沒有 GUI 的系統,只能使用 shell 完成所有操作。雖然 Bash shell 沒有包含一個 GUI 來管理多個程式,但可以在背景和前景直接移動活動程式,這樣就可以執行很多程式並選擇目前想要處理的程式。
6.3.1 啟動背景處理程序
將指令放入背景:
在指令後添加一個
&使用
at指令執行其他指令對於執行中的處理程序使用 Ctrl+Z 停止,再輸入
fg帶回前景或bg開始在背景執行
為避免背景輸出干擾前景操作,可將其導向到空裝置
2>/dev/null
可透過 jobs 指令查看背景執行的指令 (使用 -l 可查看 PID)。在工作序號前 + 表示最近放到背景的工作,- 表示在最近放的背景工作之前放到背景的工作。
6.3.2 使用前景和背景指令
如果想引用一個背景工作,透過 % 和工作編號 (jobs 指令的輸出),此外還有如下方式:
%— 引用最近放入背景的 (即編號後帶有 + 的)%string— 以 string 開頭的工作 (必須明確,即比對結果唯一)%?string— 指令列任意位置包含 string (同樣必須明確,即比對結果唯一)%--— 引用在最近放的背景工作之前放到背景的工作 (即編號後帶有 - 的)
使用 fg %1 以將編號為 1 的工作帶到前景,使用 bg %5 以將停止的編號為 5 的指令在背景繼續執行。
對於 vi 指令放到背景前會自動停止,記得先儲存檔案再放入背景以防忘記。
6.4 終止和改變處理程序
可以向處理程序發送不同的訊號來更改其行為,也可以更改處理程序的處理器優先權。
6.4.1 使用 kill 和 killall 指令終止處理程序
雖然這兩個指令常用於終止一個執行中的處理程序,但實際上是向處理程序發送一些有效訊號。訊號透過數字或名稱來表示。
| 訊號 | 數字 | 描述 |
|---|---|---|
| SIGHUP | 1 | 重新讀取設定檔 |
| SIGINT | 2 | 透過鍵盤中斷 |
| SIGQUIT | 3 | 透過鍵盤結束 |
| SIGABRT | 6 | 呼叫 abort(3) 產生的中止訊號 |
| SIGKILL | 9 | 強制刪除訊號 |
| SIGTERM | 15 | 終止訊號 |
| SIGCONT | 19,18,25 | 繼續被停止的處理程序 |
| SIGSTOP | 17,19,23 | 停止處理程序 |
對於最後兩個訊號,第一個值適用於 Alpha 和 SPARC,中間的值適用於 x86,最後一個值適用於 MIPS 體系結構。
預設為 SIGTERM (15) 訊號。雖然不同處理程序可以對不同訊號予以回應,然而任何處理程序都不能阻止 SIGKILL (9) 和 SIGSTOP 訊號。
- 使用 kill 指令並根據 PID 向處理程序發送資訊
| |
例如刪除處理程序 ID 為 2333 的處理程序:kill -9 2333 或者 kill -SIGKILL 2333
- 使用 killall 指令並根據名稱向處理程序發送訊號
與 kill 指令類似,當要刪除許多同名指令時很有用,但要防止改變有用的同名處理程序。
例如重啟 gnome-shell:killall -1 gnome-shell
6.4.2 使用 nice 和 renice 指令設置處理器優先權
當 Linux 核心嘗試決定哪些執行中的處理程序可以存取 CPU 時,其中一個需要考慮的因素就是處理程序上的 nice 值,範圍 -20~19,預設為 0。
nice 值越低,優先權越高,只有 root 使用者可以設置負值並將優先權調高 (值調低),一般使用者只能調低優先權 (值調高)。
可以使用 nice 指令執行一個帶有特定 nice 值的指令,也可以使用 renice 指令和 PID 更改已執行處理程序的 nice 值,例如:
nice -n +5 updatedb & 在背景以 5 的優先權執行 updatedb 指令
renice -n 3 2333 將 PID 為 2333 的處理程序的 nice 值改為 3
6.5 使用 cgroups 限制處理程序
為一個處理程序所設置的 nice 值不能套用於子處理程序,也就是說,nice 無法對特定使用者或應用程式可以使用的 Linux 系統資源總量進行限制。
可以使用 cgroups 指令將一個處理程序確定為一個任務 (task),並從屬於一個特定的控制群組。可以在一個層次結構中設置任務,其中包含一個被稱為守護行程 (daemon) 的任務 (為所有背景伺服器處理程序設置了預設限制) 以及子任務,子任務設置像 httpd 或 vsftpd 上的特定限制。
當一個任務啟動一個處理程序時,其子處理程序將繼承父處理程序限制設置,限制內容包括儲存、處理器排程、處理程序報告、CPU 分配、裝置存取、記憶體使用情況等。
設置 cgroups 可能非常棘手,包括編輯設定檔建立 cgroups (/etc/cgconfig.conf) 或限制特定使用者或群組 (/etc/cgrules.conf)。可以使用 cgcreate 指令建立 cgroups,從而將這些群組添加到 /sys/fs/cgroup 層次結構中。如果設置不正確,系統可能無法啟動。