kill和killall
在Linux中,每个程序和守护程序都是一个“进程”。 大多数进程代表一个正在运行的程序。 其他程序可以派生其他进程,例如侦听某些事情发生并对其做出响应的进程。 而且每个过程都需要一定数量的内存和处理能力。 您运行的进程越多,所需的内存和CPU周期就越多。 在较旧的系统(例如,我使用了7年的笔记本电脑)或较小的计算机(例如,Raspberry Pi)上,如果您留意后台运行的进程,则可以充分利用系统的性能。
您可以使用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系统中,进程从PID 1开始计数,这是内核启动后要运行的第一个进程。 这里, systemd是第一个进程,它产生了kthreadd 。 而kthreadd创建了其他进程,包括rcu_gp , rcu_par_gp以及其他一系列进程。
该系统将自行处理大多数后台进程,因此您无需担心它们。 您通常只需要运行应用程序即可参与管理您创建的任何进程。 尽管许多应用程序一次运行一个进程(例如您的音乐播放器,终端仿真器或游戏),但其他应用程序可能会创建后台进程。 当您退出应用程序时,其中一些可能会继续运行,以便下次启动应用程序时它们可以快速恢复工作。
当我运行Chromium时,流程管理是一个问题,Chromium是Google 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进程和一个grep进程正在搜索字符串“ chromium”。
$
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终止所有与名字匹配的进程。 这意味着我们可以使用此命令来停止所有流氓Chromium进程。 这很简单:
$ killall / usr / lib64 / chromium-browser / chromium-browser
但是要小心killall 。 该命令可以终止任何与您提供的匹配的进程。 这就是为什么我想首先使用ps -ef检查我正在运行的进程,然后针对要停止的命令的确切路径运行killall 。
您可能还想使用-i或--interactive选项让killall在停止每个进程之前提示您。
killall还支持使用-o或--older-than选项来选择比特定时间更早的进程的选项。 例如,如果您发现一组无人值守运行了几天的无赖进程,这将很有帮助。 或者,您可以选择比特定时间还年轻的流程,例如您最近启动的失控流程。 使用-y或--younger-than选项选择这些过程。
您还可以寻找其他方法来管理流程。 就我而言,退出浏览器后,我实际上并不需要使用kill或killall来停止Chromium后台进程。 Chromium中有一个简单的设置可以控制:
不过,始终注意系统上正在运行哪些进程并知道如何在需要时进行管理始终是一个好主意。
翻译自: https://opensource.com/article/20/1/linux-kill-killall
kill和killall