Contents

通过Linux中给定的部分名称杀死进程

1. 概述

进程管理是 Linux 管理的一个基本方面。在本文中,我们将了解如何使用进程名称来终止进程。

2.设置一个进程杀死

让我们创建一个使用dummy_process作为别名执行sleep 命令的场景:

[itcodingman@blogdemo ~]$ bash -c 'exec -a dummy_process sleep 40000' &

我们使用ps 命令验证我们的进程是否正在运行:

[itcodingman@blogdemo ~]$ ps aux |grep dummy_process
user       10009  0.0  0.0   7284   728 pts/0    S    10:34   0:00 dummy_process 40000
user       10232  0.0  0.0  12112  1052 pts/0    R+   10:44   0:00 grep --color=auto dummy_process

3. 杀死一个进程

3.1. 在*/proc/pid/stat*的帮助下终止进程

因此,我们使用符号或数字信号名称终止进程。在我们的例子中,我们省略了信号名称,因为信号名称SIGTERM是发送给进程的默认信号:

[itcodingman@blogdemo ~]$ pkill dummy_process

我们看到dummy_process没有被杀死:

[itcodingman@blogdemo ~]$ ps aux |grep dummy_process
user       10009  0.0  0.0   7284   728 pts/0    S    10:34   0:00 dummy_process 40000
user       10582  0.0  0.0  12112   984 pts/0    S+   11:00   0:00 grep --color=auto dummy_process

pkill 命令通过读取 /proc/process_id/stat来检索进程的名称:

[itcodingman@blogdemo ~]$ cat /proc/10009/stat
10009 (sleep) S 3292 10009 3292 34816 10721 1077936128 270 0 0 0 0 0 0 0 20 0 1 0 2785965 7458816 182 18446744073709551615 94380410159104 94380410187168 140735499122208 0 0 0 0 0 0 1 0 0 17 0 0 0 0 0 0 94380412287824 94380412289152 94380438171648 140735499125715 140735499125735 140735499125735 140735499128809 0

此外,括号中的第二个单词是运行pkill时应指定的进程名称:

[itcodingman@blogdemo ~]$ pkill sleep
[1]+  Terminated              bash -c 'exec -a dummy_process sleep 40000'

3.2. 在pgrep的帮助下杀死一个进程

我们可以使用它的别名杀死dummy_process。事实上,我们通过指定*-f* 选项来做到这一点,它允许我们将给定的进程名称与完整的进程名称相匹配。

假设我们已经重新创建了dummy_process

[itcodingman@blogdemo ~]$ pkill -f dummy_process
[2]-  Terminated              bash -c 'exec -a dummy_process sleep 40000'

但是,pkill命令很容易误操作,因为它会杀死任何与给定进程名称匹配的进程。让我们创建两个名为dummy_processimportant_dummy_process的进程。

让我们假设important_dummy_process是一个我们不想被终止的关键进程:

[itcodingman@blogdemo ~]$ ps aux |grep dummy
user       12764  0.0  0.0   7284   788 pts/0    S    12:29   0:00 dummy_process 40000
user       12774  0.0  0.0   7284   824 pts/0    S    12:30   0:00 important_dummy_process 40000
user       12793  0.0  0.0  12112  1092 pts/0    S+   12:30   0:00 grep --color=auto dummy
[itcodingman@blogdemo ~]$ pkill -f dummy_process
[2]   Terminated              bash -c 'exec -a dummy_process sleep 40000'
[3]-  Terminated              bash -c 'exec -a important_dummy_process sleep 40000'

我们看到给定的名称dummy_process匹配两个进程并杀死了这两个进程。这可能非常危险。我们可以使用pgrep 命令筛选各种匹配的进程,并使用其唯一 ID 号杀死特定进程:

itcodingman@blogdemo ~]$ pgrep -fa dummy_process
13005 important_dummy_process 40000
13012 dummy_process 40000
[itcodingman@blogdemo ~]$ kill 13012
[3]-  Terminated              bash -c 'exec -a dummy_process sleep 40000'

此外,我们可以使用pidof 命令来识别要杀死的进程的唯一 ID 号:

[itcodingman@blogdemo ~]$ pidof dummy_process
13788
[itcodingman@blogdemo ~]$ pidof dummy_process | xargs kill
[3]-  Terminated              bash -c 'exec -a dummy_process sleep 40000'

此外,我们可以指定no-run-if-empty选项。如果没有提供参数,这将确保xargs 不会执行:

pidof dummy_process | xargs -r kill
[3]-  Terminated              bash -c 'exec -a dummy_process sleep 40000'

3.3. 使用killall杀死多个进程

让我们创建多个不复制任何内容的dd 进程,然后继续查看如果我们运行pkill会杀死哪些进程:

[itcodingman@blogdemo ~]$ dd if=/dev/zero of=/dev/null &
[1] 3593
[itcodingman@blogdemo ~]$ dd if=/dev/zero of=/dev/null &
[2] 3601
[itcodingman@blogdemo ~]$ dd if=/dev/zero of=/dev/null &
[3] 3608
[itcodingman@blogdemo ~]$ dd if=/dev/zero of=/dev/null &
[4] 3615
[itcodingman@blogdemo ~]$ pgrep -fa dd
2 kthreadd
184 ipv6_addrconf
1067 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
1770 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
2018 /usr/bin/dbus-daemon --config-file=/usr/share/defaults/at-spi2/accessibility.conf --nofork --print-address 3
2404 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
2506 /usr/bin/dbus-daemon --config-file=/usr/share/defaults/at-spi2/accessibility.conf --nofork --print-address 3
2749 /usr/libexec/evolution-addressbook-factory
2773 /usr/libexec/evolution-addressbook-factory-subprocess --factory all --bus-name org.gnome.evolution.dataserver.Subprocess.Backend.AddressBookx2749x2 --own-path /org/gnome/evolution/dataserver/Subprocess/Backend/AddressBook/2749/2
3593 dd if=/dev/zero of=/dev/null
3601 dd if=/dev/zero of=/dev/null
3608 dd if=/dev/zero of=/dev/null
3615 dd if=/dev/zero of=/dev/null

另一方面,killall 命令提供了一个更安全的选项,可以通过名称杀死多个进程

[itcodingman@blogdemo ~]$ dd if=/dev/zero of=/dev/null &
[1] 3324
[itcodingman@blogdemo ~]$ dd if=/dev/zero of=/dev/null &
[2] 3331
[itcodingman@blogdemo ~]$ dd if=/dev/zero of=/dev/null &
[3] 3338
[itcodingman@blogdemo ~]$ dd if=/dev/zero of=/dev/null &
[4] 3345
[itcodingman@blogdemo ~]$ killall dd
[1]   Terminated              dd if=/dev/zero of=/dev/null
[2]   Terminated              dd if=/dev/zero of=/dev/null
[3]-  Terminated              dd if=/dev/zero of=/dev/null
[4]+  Terminated              dd if=/dev/zero of=/dev/null