簡介
當我們大多數人使用電腦時,我們會執行各種應用程式。這些應用程式是由稱為伺服器或作業系統的程式所執行的。有許多不同種類的伺服器以不同的方式運作。其中之一是 Linux。Linux 以行程(process)的形式執行應用程式。
在 Linux 中,我們將每個應用程式稱為「行程」。伺服器能夠管理行程生命週期的底層部分。作為使用者,您可能需要與伺服器互動以操作一些較高層次的部分。您可以使用各種工具與作業系統進行通訊和管理。您可以使用許多指令來修改伺服器的各個方面和功能。這裡有一個簡單易懂的 關於如何在 Ubuntu 上輕鬆設定 Linux 伺服器的教學。您可以進一步學習 如何安裝 LAMP 軟體堆疊 (Linux, Apache, MySQL, PHP).
本指南重點介紹如何使用 ps、kill 和 nice 來管理 Linux 中的行程。
在 Linux 中檢視執行中的行程
- top
首先,您應該知道的最基本指令之一是 top。此工具可協助您視覺化目前系統上正在執行的行程。以下是執行它時的顯示畫面:
|
1 |
top |

在結果的頂部,您可以找到系統統計資訊。這會為您提供系統負載和任務數量等資訊。在此範例中,您可以確定有一個執行中的行程和 55 個閒置行程。閒置或睡眠中的行程是您目前未使用的行程。這意味著它們沒有佔用系統資源。最後,您可以在彈出視窗底部附近看到所有執行中的行程及其使用率統計資訊。
- htop
在使用此指令之前,您必須輸入並執行以下命令從套件庫中安裝它:
|
1 |
sudo apt-get install htop |
安裝完成後,您可以使用它來顯示與 top 類似的資訊。主要區別在於,使用 htop 指令,您可以獲得更具親和力、更易於閱讀的結果:
|
1 |
htop |

如您所見,這個結果非常容易理解和解讀。
使用 ps 列出行程
雖然您可以使用上述指令來檢視執行中的行程,但它們可能無法涵蓋所有情況。幸運的是,我們有一個更強大、更靈活的工具可以使用。這就是 ps 指令。
讓我們來看看直接執行該指令會顯示什麼:
|
1 |
ps |

在此輸出中,您可以看到與目前使用者和工作階段相關的所有執行中行程。然而,這並不能提供太多資訊。
如果您想更全面地檢視系統上執行的所有行程,您需要使用參數。參數允許您查看所有使用者擁有的所有行程,無論其與終端機的關聯如何。輸出也會以非常友善且易於閱讀的格式呈現。以下是一個範例:
|
1 |
ps aux |

另一方面,您也可以用樹狀格式來視覺化這些資訊。在這裡,如您所見,階層關係也變得一目了然:
|
1 |
ps axjf |

在此範例中,您可以看到 kthreadd 如何顯示為後續行程的父行程。
- 什麼是行程 ID?
作為 Linux 或 Unix 使用者,您應該了解行程 ID。行程 ID 也稱為 PID,是系統分配給每個行程的唯一識別碼。伺服器就是透過這些識別碼來追蹤每個單獨的行程。要了解特定行程的 PID,您必須使用 pgrep 指令,如下所示:
|
1 |
pgrep bash |
|
1 2 |
輸出: 1340 |
當您啟動系統時,第一個行程開始執行。這個行程稱為 init。作為預設機制,init 行程會獲得 PID「1」。您可以按照以下方式檢查此行程的 PID:
|
1 |
pgrep init |
|
1 2 |
輸出: 1 |
接著,init 行程負責啟動所有其他程式或行程。可以理解的是,後續行程將具有遞增或更大的 PID。
- 什麼是父行程?
另一個需要了解的概念是父行程。如果行程 A 產生了行程 B,那麼行程 A 就是行程 B 的父行程。為了幫助區分它們,系統會為父行程分配一個 PPID。每當您執行 top、htop 和 ps 等任何管理指令時,您都可以在欄位標頭中注意到這個 PPID。
- 什麼是父子關係?
正如我們所知,父行程會產生子行程。這個建立過程分為兩個步驟。第一步是 fork()。這首先會建立一個新的位址空間。它還會使用寫入時複製(copy-on-write)來複製父行程的資源,以便子行程也可以使用。第二步是 exec()。這負責在剛建立的位址空間中載入並執行可執行檔。
- 如果子行程在父行程之前終止會怎樣?
如果發生這種情況,子行程就會變成殭屍行程。也就是說,直到父行程收集了有關它的某些資訊,或者告訴核心它不需要相關資訊為止。一旦發生這種情況,該行程之前使用的資源現在將會釋放。
- 如果父行程在子行程之前終止會怎樣?
在這種情況下,系統會將子行程重新分配給另一個父行程。它可能是 init 或任何其他行程。
在 Linux 中向行程傳送訊號
您可以透過傳送訊號來讓特定的行程對您做出回應。訊號可以幫助您與作業系統進行溝通。您可以使用訊號來讓應用程式終止、啟動或修改特定的行為或任務。
- 使用 PID 傳送訊號
在 Linux 中,您可以用來傳送訊號的公用程式之一是 kill。顧名思義,此指令可協助您終止或刪除行程:
|
1 |
kill PIDoftarget_process |
此公用程式會向行程傳送 TERM 訊號,告知其終止行程。該指令可讓應用程式輕鬆進行清理並退出。如果程式在收到 TERM 訊號後無法順利退出,您可以繞過它直接傳送 KILL 訊號:
|
1 |
kill -KILL PIDoftarget_process |
此訊號不會傳送到程式。它會傳送到作業系統核心。核心將直接關閉該行程。當程式忽略您傳送給它的訊號時,您可以使用此方法。
在此指令中,您也可以將訊號名稱替換為與其關聯的數字。例如,您可以使用「-15」代替「-TERM」。同樣地,您可以用「-9」代替「-KILL」。
- 將訊號用於各種用途
除了刪除或終止程式之外,您還可以使用訊號來做其他事情。例如,您可能會遇到處理重新啟動常駐程式的問題。每當常駐程式收到掛斷訊號或 HUP 時,它就會在類似以下的程式中重新啟動:Apache。若要覆寫此行為,您可以使用以下訊號:
|
1 |
sudo kill -HUP pidofapache |
此指令將使 Apache 重新載入其設定。因此,它將繼續為您提供相關內容。
如果您想查看可以使用 kill 公用程式傳送哪些訊號,請使用以下指令:
|
1 |
kill -l |

- 按名稱傳送訊號
傳統上,您會使用程式的 PID 來傳送訊號。然而,您也可以選擇使用行程的常規名稱來傳送訊號。若要執行此操作,您可以使用 pkill 指令。它的運作方式與 pkill 指令類似。唯一的區別是它允許您使用行程名稱:
|
1 |
pkill -9 ping |
此 pkill 指令相當於以下 kill 指令:
|
1 |
kill -9 `pgrep ping` |
當您想向每個執行個體(而不是特定行程)傳送訊號時,您也可以使用一個指令。以下指令將向系統上執行的所有 Firefox 執行個體傳送 TERM 訊號:
|
1 |
killall firefox |
調整行程優先級
使用 Linux 指令可以做的另一件事是調整優先級。這意味著您可以決定在您的伺服器環境中哪個行程具有優先權。您可能會認為某些行程至關重要,而其他行程可能沒那麼必要。系統只會在有剩餘資源時才執行後者。
您可以透過 niceness 指令在 Linux 中控制行程優先級。此值將高優先級任務表示為「less nice」(較不友善),將低優先級行程表示為「more nice」(較友善)。您可以這樣想:高優先級行程較不友善,因為它們獨佔了資源;低優先級任務則分享資源,因此它們更友善。
當您執行 top 指令時,可以看到特定行程的 nice 值。此值位於「NI」欄位。高優先級任務的 nice 值範圍在「-19/-20」之間。低優先級行程的範圍在「19/20」之間。您會看到類似這樣的內容:
|
1 |
top |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
任務: 56 總計, 1 執行中, 55 睡眠中, 0 已停止, 0 僵屍 Cpu(s): 0.0%us, 0.3%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st 記憶體: 1019600k 總計, 324496k 已使用, 695104k 空閒, 8512k 緩衝區 置換空間: 0k 總計, 0k 已使用, 0k 空閒, 264812k 快取 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1635 root 20 0 17300 1200 920 R 0.3 0.1 0:00.01 top 1 root 20 0 24188 2120 1300 S 0.0 0.2 0:00.56 init 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:00.11 ksoftirqd/0 |
如果您想以自訂的 nice 值執行行程,只需使用 nice 指令:
|
1 |
nice -n 15 commandtoexecute |
此指令僅在您啟動特定程式時有效。如果您想變更已在執行中程式的 nice 值,則必須使用 renice:
|
1 |
renice 0 PIDtoprioritize |
結論
如您所見,這裡的工具與圖形介面工具大不相同。因此,對於初學者來說可能很難理解。本指南將幫助您熟悉這些指令。多加練習將有助於您更好地學習並更有效地使用它們。
歡迎查看我們的其他資源,這些資源可以幫助您更好地管理 Linux 伺服器,包括以下教學:如何設定您的 Linux 伺服器以使用基於 SSH 金鑰的驗證, 使用 whereis、which、whatis、readlink 和 find 在您的 Linux VPS 系統上定位檔案,以及在 Linux VPS 上讀取和設定環境變數與 shell 變數.
祝您運算愉快!
留言
目前尚無留言。成為第一個留言的人吧。