Contents

如何在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

在系统监视器中,我们可以看到当前正在运行的所有进程的列表。要终止进程,我们浏览该列表,右键单击该进程,然后选择终止选项。