如何在 Linux 上使用 kill 和 killall 來管理程式

大雄45發表於2021-03-27
導讀 瞭解如何使用 ps、kill 和 killall  來終止程式並回收系統資源。

在   中,每個程式和守護程式daemon都是一個“程式process”。 大多數程式代表一個正在執行的程式。而另外一些程式可以派生出其他程式,比如說它會偵聽某些事件的發生,然後對其做出響應。並且每個程式都需要一定的記憶體和處理能力。你執行的程式越多,所需的記憶體和 CPU 使用週期就越多。在老式電腦(例如我使用了 7 年的膝上型電腦)或輕量級計算機(例如樹莓派)上,如果你關注過後臺執行的程式,就能充分利用你的系統。

如何在 Linux 上使用 kill 和 killall 來管理程式如何在 Linux 上使用 kill 和 killall 來管理程式

你可以使用 ps  來檢視正在執行的程式。你通常會使用 ps 命令的引數來顯示出更多的輸出資訊。我喜歡使用 -e 引數來檢視每個正在執行的程式,以及 -f 引數來獲得每個程式的全部細節。以下是一些例子:

$ ps
    PID TTY          TIME CMD
  88000 pts/0    00:00:00 bash
  88052 pts/0    00:00:00 ps
  88053 pts/0    00:00:00 head
$ ps -e | head
    PID TTY          TIME CMD
      1 ?        00:00:50 systemd
      2 ?        00:00:00 kthreadd
      3 ?        00:00:00 rcu_gp
      4 ?        00:00:00 rcu_par_gp
      6 ?        00:00:02 kworker/0:0H-events_highpri
      9 ?        00:00:00 mm_percpu_wq
     10 ?        00:00:01 ksoftirqd/0
     11 ?        00:00:12 rcu_sched
     12 ?        00:00:00 migration/0
$ ps -ef | head
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  0 13:51 ?        00:00:50 /usr/lib/systemd/systemd --switched-root --system --deserialize 36
root           2       0  0 13:51 ?        00:00:00 [kthreadd]
root           3       2  0 13:51 ?        00:00:00 [rcu_gp]
root           4       2  0 13:51 ?        00:00:00 [rcu_par_gp]
root           6       2  0 13:51 ?        00:00:02 [kworker/0:0H-kblockd]
root           9       2  0 13:51 ?        00:00:00 [mm_percpu_wq]
root          10       2  0 13:51 ?        00:00:01 [ksoftirqd/0]
root          11       2  0 13:51 ?        00:00:12 [rcu_sched]
root          12       2  0 13:51 ?        00:00:00 [migration/0]

最後的例子顯示最多的細節。在每一行,UID(使用者 ID)顯示了該程式的所有者。PID(程式 ID)代表每個程式的數字 ID,而 PPID(父程式 ID)表示其父程式的數字 ID。在任何 Unix 系統中,程式是從 1 開始編號,是核心啟動後執行的第一個程式。在這裡,systemd 是第一個程式,它催生了 kthreadd,而 kthreadd 還建立了其他程式,包括 rcu_gp、rcu_par_gp 等一系列程式。

使用 kill 命令來管理程式

系統會處理大多數後臺程式,所以你不需要操心這些程式。你只需要關注那些你所執行的應用建立的程式。雖然許多應用一次只執行一個程式(如音樂播放器、終端模擬器或遊戲等),但其他應用則可能建立後臺程式。其中一些應用可能當你退出後還在後臺執行,以便下次你使用的時候能快速啟動。

當我執行 Chromium(作為谷歌 Chrome 瀏覽器所基於的開源專案)時,程式管理便成了問題。 Chromium 在我的膝上型電腦上執行非常吃力,併產生了許多額外的程式。現在我僅開啟五個選項卡,就能看到這些 Chromium 程式:

$ ps -ef | fgrep chromium
jhall      66221   [...]  /usr/lib64/chromium-browser/chromium-browser [...]
jhall      66230   [...]  /usr/lib64/chromium-browser/chromium-browser [...]
[...]
jhall      66861   [...]  /usr/lib64/chromium-browser/chromium-browser [...]
jhall      67329   65132  0 15:45 pts/0    00:00:00 grep -F chromium

我已經省略一些行,其中有 20 個 Chromium 程式和一個正在搜尋 “chromium" 字元的 grep 程式。

$ ps -ef | fgrep chromium | wc -l
21

但是在我退出 Chromium 之後,這些程式仍舊執行。如何關閉它們並回收這些程式佔用的記憶體和 CPU 呢?

kill 命令能讓你終止一個程式。在最簡單的情況下,你告訴 kill 命令終止你想終止的程式的 PID。例如,要終止這些程式,我需要對 20 個 Chromium 程式 ID 都執行 kill 命令。一種方法是使用命令列獲取 Chromium 的 PID,而另一種方法針對該列表執行 kill:

$ ps -ef | fgrep /usr/lib64/chromium-browser/chromium-browser | awk '{print $2}'
66221
66230
66239
66257
66262
66283
66284
66285
66324
66337
66360
66370
66386
66402
66503
66539
66595
66734
66848
66861
69702
 
$ ps -ef | fgrep /usr/lib64/chromium-browser/chromium-browser | awk '{print $2}' > /tmp/pids
$ kill $(cat /tmp/pids)

最後兩行是關鍵。第一個命令列為 Chromium 瀏覽器生成一個程式 ID 列表。第二個命令列針對該程式 ID 列表執行 kill 命令。

介紹 killall 命令

一次終止多個程式有個更簡單方法,使用 killall 命令。你或許可以根據名稱猜測出,killall 會終止所有與該名字匹配的程式。這意味著我們可以使用此命令來停止所有流氓 Chromium 程式。這很簡單:

$ killall /usr/lib64/chromium-browser/chromium-browser

但是要小心使用 killall。該命令能夠終止與你所給出名稱相匹配的所有程式。這就是為什麼我喜歡先使用 ps -ef 命令來檢查我正在執行的程式,然後針對要停止的命令的準確路徑執行 killall。

你也可以使用 -i 或 --interactive 引數,來讓 killkill 在停止每個程式之前提示你。

killall 還支援使用 -o 或 --older-than 引數來查詢位元定時間更早的程式。例如,如果你發現了一組已經執行了好幾天的惡意程式,這將會很有幫助。又或是,你可以查詢位元定時間更晚的程式,例如你最近啟動的失控程式。使用 -y 或 --young-than 引數來查詢這些程式。

其他管理程式的方式

程式管理是系統維護重要的一部分。在我作為 Unix 和 Linux 系統管理員的早期職業生涯中,殺死非法作業的能力是保持系統正常執行的關鍵。在如今,你可能不需要親手在 Linux 上的終止流氓程式,但是知道 kill 和 killall 能夠在最終出現問題時為你提供幫助。

你也能尋找其他方式來管理程式。在我這個案例中,我並不需要在我退出瀏覽器後,使用 kill 或 killall 來終止後臺 Chromium 程式。在 Chromium 中有個簡單設定就可以進行控制:
如何在 Linux 上使用 kill 和 killall 來管理程式如何在 Linux 上使用 kill 和 killall 來管理程式

不過,始終關注系統上正在執行哪些程式,並且在需要的時候進行干預是一個明智之舉。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2765238/,如需轉載,請註明出處,否則將追究法律責任。

相關文章