如何在Linux中杀死背景过程
1. 概述
有几种方法可以杀死进程(也称为任务) ,其中大多数涉及在终端中运行命令。
在本教程中,我们将重点介绍与后台进程相关的方式。
2. 开始之前
2.1. kill 命令
在 Linux 中用于终止进程的基本命令是kill 。此命令与我们想要结束的进程的 ID(或 PID )一起使用。
除了 PID,我们还可以使用其他标识符结束进程,我们将在下面看到。
kill命令接收一个终止信号,该信号可以具有以下几个值之一:
- SIGINT (2) - 与在终端中按Ctrl+C的结果相同;它不会自动结束进程
- SIGQUIT (3) – 与 SIGINT 做同样的事情,但产生核心转储的额外好处
- SIGKILL (9) – 强制终止进程;它不能被忽视或优雅地关闭
- SIGTERM (13) – 终止进程,但有时间优雅地关闭
如果我们不指定终止信号,将使用默认的 SIGTERM (13)。
2.2. 前台进程
另外,让我们记住后台进程和前台进程之间的区别。
前台进程是我们直接运行并等待它完成的 任何命令或进程,例如:
$ ls -l
total 716
-rwxr-xr-x 1 root root 1563 oct 23 2016 espdiff
-rwxr-xr-x 1 root root 117104 sep 26 2019 gnome-mahjongg
-rwxr-xr-x 1 root root 125304 sep 13 2019 gnome-mines
-rwxr-xr-x 1 root root 178712 sep 10 2019 gnome-sudoku
-rwxr-xr-x 1 root root 302336 sep 15 2019 sol
另一方面,后台进程是 shell 不等待的进程。要运行后台进程,我们在要启动的进程末尾附加“ & ” :
$ ./myScript.sh &
3. 如何真正停止进程
正如我们在开头提到的,大多数时候,我们需要将 PID 与kill命令结合使用,但这不是唯一的方法,正如我们将看到的那样。
3.1. ps
ps 命令用于列出 Linux 中的进程。在这里,我们将添加*-eaf*以获取我们想要的信息:
$ ps -eaf
UID PID PPID C STIME TTY TIME CMD
blogdemo-reader 3208 2578 0 14:20 ? 00:00:01 /usr/share/skypeforlinux/sky
blogdemo-reader 3226 2578 2 14:20 ? 00:00:06 /snap/slack/24/usr/lib/slack
blogdemo-reader 3230 3208 0 14:20 ? 00:00:00 /usr/share/skypeforlinux/sky
blogdemo-reader 3232 3230 0 14:20 ? 00:00:00 /usr/share/skypeforlinux/sky
blogdemo-reader 3277 3208 0 14:20 ? 00:00:00 /usr/share/skypeforlinux/sky
blogdemo-reader 3280 3208 0 14:20 ? 00:00:00 /usr/share/skypeforlinux/sky
blogdemo-reader 3325 3208 3 14:20 ? 00:00:08 /proc/self/exe --type=render
blogdemo-reader 3363 3226 0 14:20 ? 00:00:00 /snap/slack/24/usr/lib/slack
blogdemo-reader 3398 3226 0 14:20 ? 00:00:00 /snap/slack/24/usr/lib/slack
blogdemo-reader 3411 2578 12 14:20 ? 00:00:29 /opt/google/chrome/chrome
blogdemo-reader 3417 3411 0 14:20 ? 00:00:00 cat
blogdemo-reader 3418 3411 0 14:20 ? 00:00:00 cat
blogdemo-reader 3423 3226 0 14:20 ? 00:00:00 /snap/slack/24/usr/lib/slack
blogdemo-reader 3426 3411 0 14:20 ? 00:00:00 /opt/google/chrome/chrome --
blogdemo-reader 3428 3411 0 14:20 ? 00:00:00 /opt/google/chrome/chrome --
blogdemo-reader 3429 3428 0 14:20 ? 00:00:00 /opt/google/chrome/nacl_help
blogdemo-reader 3432 3428 0 14:20 ? 00:00:00 /opt/google/chrome/chrome --
blogdemo-reader 3434 3426 0 14:20 ? 00:00:00 /opt/google/chrome/nacl_help
blogdemo-reader 3441 3208 0 14:20 ? 00:00:00 /usr/share/skypeforlinux/sky
blogdemo-reader 3456 3226 5 14:20 ? 00:00:12 /snap/slack/24/usr/lib/slack
blogdemo-reader 3482 3411 1 14:20 ? 00:00:03 /opt/google/chrome/chrome --
blogdemo-reader 3531 3426 3 14:20 ? 00:00:09 /opt/google/chrome/chrome --
blogdemo-reader 3533 3531 0 14:20 ? 00:00:00 /opt/google/chrome/chrome --
blogdemo-reader 3603 3432 3 14:20 ? 00:00:07 /opt/google/chrome/chrome --
blogdemo-reader 3617 3432 3 14:20 ? 00:00:08 /opt/google/chrome/chrome --
blogdemo-reader 3631 3432 0 14:20 ? 00:00:01 /opt/google/chrome/chrome --
blogdemo-reader 3870 3432 5 14:21 ? 00:00:11 /opt/google/chrome/chrome --
blogdemo-reader 3892 3432 25 14:21 ? 00:00:57 /opt/google/chrome/chrome --
blogdemo-reader 3905 2892 9 14:21 ? 00:00:22 ./jetbrains-toolbox --minimi
运行ps 后,我们直观地扫描要结束的进程的 PID,然后运行kill命令,传入 PID:
$ sudo kill -9 3905
3.2. pgrep
pgrep 命令按名称查找进程并返回每个匹配项的PID:
$ pgrep chrome
733
3638
11679
11736
11776
11848
11850
12193
12208
12240
12275
14705
17372
18003
18378
18526
18540
18736
22401
23844
$ sudo kill -9 733
3.3. pkill
pkill 是可以使用进程名称直接杀死后台进程的命令之一。 例如,如果我们想停止所有 RabbitMQ 实例,我们可以使用:
$ sudo pkill rabbitmq
3.4. jobs
杀死进程的另一种方法是通过它的作业号。这就是*jobs *命令帮助我们的地方。 首先,让我们启动几个工作:
$ sleep 100 &
[1] 24827
$ sleep 200 &
[2] 24832
请注意,我们会在每个命令之后看到作业 ID 和 PID。 我们可以使用作业来列出它们:
$ jobs
[1]- Running sleep 100 &
[2]+ Running sleep 200 &
然后我们可以通过作业 ID杀死:
$ kill %1 # Here 1 is the job number. We can also kill job number 2 if we want in the same way
$ jobs
[1]- Terminated sleep 100
[2]+ Running sleep 200 &
3.5. killall
与使用进程的PID 的kill相比,killall 命令采用名称,并暗示,杀死具有该名称的所有进程。
这很有用,例如,当我们打开了多个标签页的冻结网络浏览器(如 Chrome 或 Firefox)时。我们可以使用以下命令轻松杀死浏览器上运行的所有进程并关闭它:
$ killall chrome
$ killall firefox
4. 其他
4.1. fg
fg 是用于将后台进程带到前台的命令。然后,我们可以使用Ctrl+C:
$ sleep 100 &
[1] 25994
$ jobs
[1]+ Running sleep 100 &
$ fg 1
sleep 100
^C
$
4.2. 系统监视器
结束进程的另一种方法是启动系统监视器,Linux 相当于 Windows 任务管理器。要启动它,我们运行:
$ gnome-system-monitor
如果我们的机器上没有安装它,那么我们使用以下方法安装它:
$ sudo apt-get install gnome-system-monitor
在系统监视器中,我们可以看到当前正在运行的所有进程的列表。要终止进程,我们浏览该列表,右键单击该进程,然后选择终止选项。