大師 Linux 使用 ps、pgrep、pkill 等殺死進程

管理 Linux 中的進程對於新的系統管理員(sysadmin)來說可能一開始會顯得很困難。但通過一點解釋和演示,你將學會如何使用命令行工具,例如 pskill,來查找和執行 Linux 終止進程只是使用命令行工具,像

這篇文章中,你將學習到定位正在運行和異常進程、終止正在運行進程、查找後台進程等命令,以及在任何 Linux 操作系統上的更多內容。

文章結束時,你將能夠像 Linux 專業人員一樣,根據進程識別號(PID)從命令行管理進程。繼續閱讀,了解 Linux 中的進程管理命令!

先決條件

本文將進行一個關於如何管理 Linux 中進程的實例。如果你想要親自動手,你將需要以下東西:

  • A Linux host, which can be a virtual machine or a physical machine.
  • 要嘗試 PowerShell 示例,請在 Linux 主機上安裝PowerShell 7.1.1
  • A non-root user account. While root access is not required, there will be an example where the root user can kill the running process of another user.

你選擇使用的 Linux 發行版取決於你。本文將基於 Ubuntu 20.04 LTS。然而,這些命令對於 Linux 操作系統是標準的。

準備好開始了嗎?很好,讓我們開始吧。

在 Linux 中管理進程

有時,你可能會遇到需要在Linux系統上停止運行中進程的情況。例如,你可能有一個定期運行的bash腳本。該bash腳本配置為通過cron(Linux進程調度器)作業以另一個用戶身份運行。

有時,該腳本會生成錯誤進程,這可能導致腳本失敗。如何在不重新啟動系統或停止腳本的情況下終止這些錯誤進程?

在接下來的章節中,你將學習如何在Linux系統上使用命令定位並終止或kill進程。每個章節都會建立在上一個章節的基礎上。你將學習到Linux原生的pstoppgrepkillpkill命令。

作為獎勵,還包括PowerShell對應的命令Get-ProcessStop-Process,如果你不喜歡Linux原生命令的話。

定位進程的工具

在終止進程之前,你必須定位要終止的正確進程。唯一的PID可用於精確定位。繼續閱讀以了解如何定位正確的進程以進行終止。

使用ps命令顯示進程信息

進程狀態ps命令顯示與Linux系統上運行進程相關的信息。您可以定位運行中的進程,甚至可以使用ps查找後台進程

默認情況下,ps命令將顯示當前用戶的有效用戶標識(EUID)的所有進程。運行如下所示的ps命令將返回您的用戶可以終止的每個正在運行的進程。

ps
Displaying processes matching the EUID (effective user ID) for the user bkindle.

使用top命令查找擴展的進程信息

如果您想要查找有關運行中進程和系統指標的不斷刷新的信息,那麼您可以使用top命令。與ps不同,top命令會在屏幕上定期更新進程信息。

運行top命令時,您將看到不僅有PID。進程詳細信息還包括CPU和內存百分比,Nice值(CPU調度進程優先級)以及由Linux內核設置的進程優先級(PR)。

對於新手或經驗豐富的系統管理員,top命令通常是管理重要系統資源和進程的主要工具。如下所示,top命令輸出顯示的進程信息比ps命令更多,包括整體系統指標。

The top command on Ubuntu Desktop 20.04 LTS showing all running PID’s.

htoptop 的增強版本,包含各種改進,例如彩色終端輸出。

假設您想檢查一個進程正在消耗的內存或 CPU 資源。在這種情況下,您可以像下面顯示的那樣使用 topp 選項。

top -p 2113
The top command displaying information on only one PID, 2113.

也許您需要顯示特定用戶名下的所有運行中進程。top 命令提供了 u 選項,僅顯示特定用戶的進程。如下例所示,僅顯示與用戶 ID bkindle 匹配的進程 ID。

top -u bkindle
The top command displaying only processes for the user bkindle.

使用 pgrep 命令查找特定進程 PID

最初是一個 Solaris 命令,pgrep 被移植到 Linux 用於使用。結合 grep 命令的搜索功能和 ps 的進程管理,pgrep 在找到要目標的確切進程方面提供了靈活性。

儘管 ps 顯示更多信息,但 pgrep 設計為僅返回返回的進程的 PID。 pgrep 有助於使用許多可用的搜索參數來定位進程。在下面的例子中,pgrep 顯示搜索與 vmtoolsd 匹配的任何進程。

pgrep vmtoolsd
Using pgrep to obtain all PIDs associated with vmtoolsd.

同樣地,使用u開關指定使用者ID,以檢索僅與該特定使用者相關的進程。如下所示,僅返回一個用戶bkindlevmtoolsd進程的單個PID。

pgrep -u bkindle vmtoolsd
Retrieving the specific PID for the vmtoolsd process associated with the user bkindle.

在Linux中使用PowerShell的Get-Process查找進程

典型的Linux命令非常好用,但你知道PowerShell也能夠管理Linux進程嗎?Get-Process cmdlet的操作方式類似於Linux的ps命令,返回進程信息。例如,也許你需要查找當前用戶bkindle運行的所有進程。如下所示,查找用戶bkindle的所有PID(由Get-Process標記為ID)。

Get-Process -IncludeUserName |
	Where-Object {$_.UserName -eq 'bkindle'} |
	Select-Object -Property 'Id','UserName','ProcessName'
Retrieving Linux PID’s with PowerShell’s Get-Process cmdlet.

相關: 如何使用PowerShell Where-Object篩選所有內容

學會了如何定位不同進程後,繼續閱讀以發現在Linux中終止或殺死進程的所有方法!

在Linux中使用Kill命令殺死進程

在前幾節中,你已經學會了使用本機Linux和PowerShell命令查找要發送終止信號的進程的PID。接下來的部分將解釋如何使用killpkill程序,以及其相關信號和命令行開關。

Linux信號和進程管理

訊號是 Linux 與運行在作業系統中的進程通信的方法。

  • kill 命令用於終止進程的三個主要信號是:
  • 1(SIGHUP)- 終止互動式程序並導致守護程序(背景服務)重新讀取進程使用的配置文件。
  • 9(SIGKILL)- 強制進程退出而不執行優雅的關機任務。

15(SIGTERM)- 允許進程優雅地終止,例如在完成時關閉打開的文件。這是在使用 kill 命令時未指定數字時使用的默認信號。儘管本文僅關注用於終止進程的三個主要信號,但總共有 64 個可用信號。使用 kill -l 獲取信號及其相應數字的列表。

Great video on understanding process signals

現在您了解了用於終止進程的三個主要信號,請在下一節中學習如何終止進程。

使用 kill 命令終止進程

在下一個示例中,您將使用 kill 命令。假設您正在運行一個名為 pwsh 的 PowerShell 實例,並且分配的 PID 是 22687。終止此進程的一種方法如下所示。

  1. 使用 pgrep pwsh 確定進程 pwsh 的 PID,用於 kill 命令。
  2. 使用kill -s TERM 22687來優雅地終止pwsh進程。 TERM命令對應到15(SIGTERM)信號,並且使用kill命令的s參數來指示。
  3. 使用您選擇的toppspgrep來驗證PID是否不再列出。

以下是從Ubuntu 20.04 LTS bash終端機中的示例。

Using kill and associated commands to terminate the pwsh process.

使用killall命令將終止所有基於名稱而不是PID的進程,這可能會使該命令變得非常破壞性,如果不小心使用。然而,如果您選擇使用此命令,請使用i選項使命令要求確認。

使用pkill按名稱終止進程

您可能已經注意到kill命令只能使用進程ID。這可能使終止進程變得複雜且需要多個步驟。包含在procps和procps-ng套件中的pkill 命令可以根據搜索的名稱終止進程。

功能上,pkill 命令充当了pgrep程序的包装器。pkill 命令发送指定的信号给找到的每个进程,而不仅仅在终端中列出PID。pkillkill不同之处在于pkill只能使用进程的名称,而不能使用PID。

默认情况下,在Ubuntu 20.04 LTS中不提供pkill命令。您需要下载并安装该应用程序。要执行此操作,请运行sudo apt install mcollective-plugins-process -y

要使用pkill终止进程,请执行以下步骤:

  1. 使用ps验证nano应用程序(命令行文本编辑器)当前是否正在运行。此步骤是可选的,但在终止进程之前进行的安全检查。
  2. 使用pkill -9 nano强制终止nano应用程序。

下面是在Ubuntu 20.04 LTS bash终端中执行上述过程的示例。

Using the pkill command to forcefully terminate the nano process.

使用Top命令终止进程

当您运行top命令查看运行中的进程时,您可以使用k按键终止给定进程。您将看到一个交互式提示,要求输入要终止的进程的PID。

如下所示,运行top命令并按k。输入要终止的PID,然后按Enter键立即终止PID。

Use top to specify a process to terminate using the k keystroke.

接下来,了解使用PowerShell Stop-Process命令的另一种替代Linux命令的方法!

使用 PowerShell 的 Stop-Process 命令终止进程

如果你不喜欢 Linux 的原生命令,PowerShell 可以满足你的需求!就像使用 kill 命令一样,你可以使用 Stop-Process cmdlet 在 Linux 中终止进程。再次假设你正在运行一个 PowerShell 的 pwsh 进程。

  1. 使用 Get-Process -ProcessName 'pwsh' 找到 PID,并记下要终止的 PID。
  2. 使用 Stop-Process -Id 29992,30014 来终止返回的多个进程。
  3. 使用 Get-Process -ProcessName 'pwsh' 验证 PIDs,2999230014 不再列出,表示它们已被终止。

你也可以使用 Get-Processkill 方法来终止一个或多个进程:(Get-Process -Id [PID]).Kill()(Get-Process -Id [PID1,2,3,4]).Kill()

使用 ProcessName 参数时要小心。使用此参数类似于使用 killall 命令,将会终止所有匹配所提供名称的进程。

下面是从 Ubuntu 20.04 LTS bash 终端执行上述进程的示例。

Using PowerShell, Stop-Process to kill processes in Linux.

下一步

你現在應該知道在Linux中尋找和終止進程的多種方法了!為了你的下一個挑戰,試著使用SSH連接遠程殺死進程,或者殺死可能在容器中運行的進程。

相關: 在Linux中設置SSH:一個Windows人在Linux世界中

Source:
https://adamtheautomator.com/linux-kill-process/