Linux 學習 第六章 管理執行中的處理程序

📢 本文由 gemini-3-flash-preview 翻譯

第六章 管理執行中的處理程序

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

也可以自訂輸出欄位,並且根據某一欄排序,例如:

1
ps -eo pid,user,uid,group,gid,vsz,rss,comm --sort=-vsz | 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 啟動背景處理程序

將指令放入背景:

  1. 在指令後添加一個 &

  2. 使用 at 指令執行其他指令

  3. 對於執行中的處理程序使用 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 指令終止處理程序

雖然這兩個指令常用於終止一個執行中的處理程序,但實際上是向處理程序發送一些有效訊號。訊號透過數字或名稱來表示。

訊號數字描述
SIGHUP1重新讀取設定檔
SIGINT2透過鍵盤中斷
SIGQUIT3透過鍵盤結束
SIGABRT6呼叫 abort(3) 產生的中止訊號
SIGKILL9強制刪除訊號
SIGTERM15終止訊號
SIGCONT19,18,25繼續被停止的處理程序
SIGSTOP17,19,23停止處理程序

對於最後兩個訊號,第一個值適用於 Alpha 和 SPARC,中間的值適用於 x86,最後一個值適用於 MIPS 體系結構。

預設為 SIGTERM (15) 訊號。雖然不同處理程序可以對不同訊號予以回應,然而任何處理程序都不能阻止 SIGKILL (9) 和 SIGSTOP 訊號。

  1. 使用 kill 指令並根據 PID 向處理程序發送資訊
1
kill [訊號] [PID]

例如刪除處理程序 ID 為 2333 的處理程序:kill -9 2333 或者 kill -SIGKILL 2333

  1. 使用 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 層次結構中。如果設置不正確,系統可能無法啟動。