通过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_process和important_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