在 Linux 上使用 kill 和 killall 命令來管理進程
在 Linux 中,每個程序和 守護程序 都是一個「 進程 」。 大多數進程代表一個正在運行的程序。而另外一些程序可以派生出其他進程,比如說它會偵聽某些事件的發生,然後對其做出響應。並且每個進程都需要一定的內存和處理能力。你運行的進程越多,所需的內存和 CPU 使用周期就越多。在老式電腦(例如我使用了 7 年的筆記本電腦)或輕量級計算機(例如樹莓派)上,如果你關注過後台運行的進程,就能充分利用你的系統。
你可以使用 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 中有個簡單設置就可以進行控制:
![Chromium background processes setting](/data/attachment/album/202103/18/230643oguq7o1l222l2h52.png "Chromium background processes setting")
不過,始終關注系統上正在運行哪些進程,並且在需要的時候進行干預是一個明智之舉。
via: https://opensource.com/article/20/1/linux-kill-killall
作者:Jim Hall 選題:lujun9972 譯者:wyxplus 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive