Linux 下使用 killall 命令终止进程的 8 大用法

Linux 的命令行提供不少命令来杀死进程。好比,你能够向 kill 命传递一个PID来杀死进程;pkill 命令使用一个正则表达式做为输入,因此和该模式匹配的进程都被杀死。
正则表达式

可是还有一个命令叫 killall ,默认状况下,它精确地匹配参数名,而后杀死匹配进程。在这篇文章中,咱们将讨论有关这个命令的实际应用。centos

默认状况下,killall 命令将向一个/组进程发送一个 SIGTERM 信号,可是,也能够经过参数发送一个指定的信号。bash

下面咱们经过例子详细介绍 killall 的 8 大用法。微信

1. 基本用法

假如咱们 3 个进程在运行,分别是 hello1, hello2, hello3 ,如今咱们想杀死 hello1 进程,能够直接使用以下方式:ssh

killall hello1复制代码

运行的结果以下:学习

[alvin@VM_0_16_centos test]$ ps aux | grep hello
alvin    12061  0.0  0.0   4152   344 pts/0    S    14:41   0:00 ./hello1
alvin    12074  0.0  0.0   4152   344 pts/0    S    14:41   0:00 ./hello2
alvin    12084  0.0  0.0   4152   340 pts/0    S    14:41   0:00 ./hello3
alvin    12089  0.0  0.0 112648   964 pts/0    R+   14:41   0:00 grep --color=auto hello
[alvin@VM_0_16_centos test]$ killall hello1
[1]   Terminated              ./hello1
[alvin@VM_0_16_centos test]$ ps aux | grep hello
alvin    12074  0.0  0.0   4152   344 pts/0    S    14:41   0:00 ./hello2
alvin    12084  0.0  0.0   4152   340 pts/0    S    14:41   0:00 ./hello3
alvin    12170  0.0  0.0 112648   964 pts/0    R+   14:42   0:00 grep --color=auto hello复制代码

能够看到,hello1 进程已经被杀死了。ui

剩下的 hello2 和 hello3 进程,咱们想一次性杀死他们,也就是批量杀死进程,能够以下操做:spa

[alvin@VM_0_16_centos test]$ killall hello*
hello: no process found
hello1: no process found
hello.c: no process found
[2]-  Terminated              ./hello2
[3]+  Terminated              ./hello3复制代码

如此,以 hello 开头的进程所有被干掉。命令行

2. 终止某个用户所运行的进程

咱们能够杀死以知足某个正则表达式的一组进程,一样的,咱们也能够杀死某个用户运行的全部进程。code

好比,用户 harry 如今运行以下几个进程:

[alvin@VM_0_16_centos test]$ ps aux | grep harry
root     13675  0.0  0.2 148236  5584 ?        Ss   14:55   0:00 sshd: harry [priv]
harry    13677  0.0  0.1 148236  2944 ?        S    14:55   0:00 sshd: harry@pts/1
root     13678  0.0  0.2 148236  5444 ?        Ss   14:55   0:00 sshd: harry [priv]
harry    13680  0.0  0.1 148236  2252 ?        S    14:55   0:00 sshd: harry@notty
harry    13681  0.0  0.1  53228  2168 ?        Ss   14:55   0:00 /usr/libexec/openssh/sftp-server
harry    13694  0.0  0.1 116436  3252 pts/1    Ss+  14:55   0:00 -bash
harry    13948  0.0  0.0   4152   344 pts/1    S    14:57   0:00 ./hello1
harry    13952  0.0  0.0   4152   344 pts/1    S    14:57   0:00 ./hello2
harry    13959  0.0  0.0   4152   344 pts/1    S    14:57   0:00 ./hello3
alvin    14005  0.0  0.0 112648   964 pts/0    R+   14:58   0:00 grep --color=auto harry复制代码

咱们如今想杀死 harry 所运行的全部进程,能够以以下方式操做:

killall -u harry复制代码

运行结果以下:

[alvin@VM_0_16_centos test]$ sudo killall -u harry
[alvin@VM_0_16_centos test]$ ps aux | grep harry
alvin    14040  0.0  0.0 112648   964 pts/0    R+   14:58   0:00 grep --color=auto harry复制代码

可是,这个选项要慎用,由于它会把该用户全部进程,包括终端进程,所有杀死,将致使该用户直接退出。因此,若是不想挨揍的话不要轻意尝试这个选项。

3. 终于时间的方式终止进程

假如咱们如今运行了不少程序,咱们只想杀死运行时间超过 5h 的进程,那么可使用 -o 选项,其中 o 表明 older 以下:

killall -o 5h复制代码

一样地,若是你想杀死进行时间小于 4h 的进程,那么可使用 -y 选项,其中 y 表明 younger ,以下:

killall -y 4h复制代码

这两个选项一样很是粗暴,也会把终端退出,因此先不演示了。

4. 忽略大小写

默认状况下,killall 命令是大小写敏感的,因此咱们若是写错大小写,将没法正确杀死进程。

[alvin@VM_0_16_centos test]$ killall HELLO1
TEST1: no process found复制代码

若是咱们想忽略大小写,能够加上 -I (大写字母 i )选项。

[alvin@VM_0_16_centos test]$ killall -I HELLO1
[1]   Terminated              ./hello1复制代码

5. 关闭命令执行回显

默认状况下,killall 会告诉你命令执行状况,可是,咱们若是不关心它的执行结果,只想让它静默执行,该怎么办?只需加上 -q 选项便可,其中 q 表示 quite , 以下:

[alvin@VM_0_16_centos test]$ killall HELLO2
HELLO2: no process found
[alvin@VM_0_16_centos test]$ killall -q HELLO2
[alvin@VM_0_16_centos test]$复制代码

6. 列出全部支持的信号

如前文所述,默认状况下,killall 命令将发送 SIGTERM 信号,那么,安能够发送其它信号吗?固然是能够的。可使用 -l 选项查看 killall 所支持的全部信号:

[alvin@VM_0_16_centos test]$ killall -l
HUP INT QUIT ILL TRAP ABRT IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM
STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS
UNUSED复制代码

你可使用 -s 选项(后面跟一个信号名)来向一个进程发送特殊信号。

7. 交互式操做

若是你在杀死多个进程时不太放心,担忧把不应杀死的进程给杀死了,那么你可使用 -i 选项,这样就能够自由决定哪些进程应该被杀死,哪些进程应该被保留。

[alvin@VM_0_16_centos test]$ killall -i hello*
Kill hello2(13825) ? (y/N) y
Kill hello3(13831) ? (y/N) N
hello: no process found
hello1: no process found
hello3: no process found
hello.c: no process found
[2]-  Terminated              ./hello2复制代码

8. 等待直到某个进程被终止

当一个信号被发送至某个进程,若是你想肯定该进程已经被杀死了才返回执行结果,可使用 -w 选项,其中 w 表明 wait ,以下:

[alvin@VM_0_16_centos test]$ killall -w hello1
[4]+  Terminated              ./hello1复制代码

这里好像看不出什么效果,但实际执行的时候,能够发现执行结果会在一两秒后出现,而不加 -w 选项的话,执行结果立刻就显示。

码字不易,若是您以为有帮助,麻烦点个赞再走呗~

-----------------

微信搜索公众号【良许Linux】,后台回复关键字:

  1. 回复【1024】:免费获取不断更新的海量技术资源;

  2. 回复【CSDN】:免费进入CSDN资源下载群;

  3. 回复【进群】:免费进入高手如云技术交流群。

干货分享 · 资源共享 · 认知提升 · 英语学习

码字不易,若是您以为有帮助,麻烦点个赞再走呗~

-----------------

我是良许,世界500强外企 Linux 开发工程师,专业生产 Linux 干货。欢迎关注个人公众号「良许Linux」,回复「1024」获取最新最全的技术资料,回复「入群」进入高手如云技术交流群。

相关文章
相关标签/搜索