Linux 的命令行提供不少命令来杀死进程。好比,你能够向 kill 命传递一个PID来杀死进程;pkill 命令使用一个正则表达式做为输入,因此和该模式匹配的进程都被杀死。面试
可是还有一个命令叫 killall ,默认状况下,它精确地匹配参数名,而后杀死匹配进程。在这篇文章中,咱们将讨论有关这个命令的实际应用。正则表达式
默认状况下,killall 命令将向一个/组进程发送一个 SIGTERM 信号,可是,也能够经过参数发送一个指定的信号。centos
下面咱们经过例子详细介绍 killall 的 8 大用法。bash
一、基本用法架构
假如咱们 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 进程,咱们想一次性杀死他们,也就是批量杀死进程,能够以下操做:命令行
- [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 开头的进程所有被干掉。server
二、终止某个用户所运行的进程
咱们能够杀死以知足某个正则表达式的一组进程,一样的,咱们也能够杀死某个用户运行的全部进程。
好比,用户 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
可是,这个选项要慎用,由于它会把该用户全部进程,包括终端进程,所有杀死,将致使该用户直接退出。因此,若是不想挨揍的话不要轻意尝试这个选项。
三、终于时间的方式终止进程
假如咱们如今运行了不少程序,咱们只想杀死运行时间超过 5h 的进程,那么可使用 -o 选项,其中 o 表明 older 以下:
- killall -o 5h
一样地,若是你想杀死进行时间小于 4h 的进程,那么可使用 -y 选项,其中 y 表明 younger ,以下:
- killall -y 4h
这两个选项一样很是粗暴,也会把终端退出,因此先不演示了。
四、忽略大小写
默认状况下,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
五、关闭命令执行回显
默认状况下,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]$
六、列出全部支持的信号
如前文所述,默认状况下,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 选项(后面跟一个信号名)来向一个进程发送特殊信号。
七、交互式操做
若是你在杀死多个进程时不太放心,担忧把不应杀死的进程给杀死了,那么你可使用 -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
八、等待直到某个进程被终止
当一个信号被发送至某个进程,若是你想肯定该进程已经被杀死了才返回执行结果,可使用 -w 选项,其中 w 表明 wait ,以下:
- [alvin@VM_0_16_centos test]$ killall -w hello1
- [4]+ Terminated ./hello1
这里好像看不出什么效果,但实际执行的时候,能够发现执行结果会在一两秒后出现,而不加 -w 选项的话,执行结果立刻就显示。
以为不错请点赞支持,欢迎留言或进个人我的群855801563领取【架构资料专题目合集90期】、【BATJTMD大厂JAVA面试真题1000+】,本群专用于学习交流技术、分享面试机会,拒绝广告,我也会在群内不按期答题、探讨。