Linux中的Killall命令与示例

时间:2020-03-05 15:28:33  来源:igfitidea点击:

Linux命令行提供了各种命令来杀死进程。
例如,可以使用“ kill”命令通过将其PID作为参数来杀死进程,“ pkill”命令采用模式作为输入,并杀死所有匹配的正在运行的进程。
但是存在一个命令“ killall”,它默认情况下与参数名称完全匹配,并杀死匹配过程。

在本文中,我们将通过一些实际示例来讨论此命令。
killall命令可用于通过使用其名称将信号发送到特定进程。
这意味着如果我们正在运行同一程序的五个版本,killall命令将杀死所有五个版本。

可以将信号指定为该命令的参数,否则默认情况下将发送SIGTERM。
一个进程可以生成独立于父进程的子进程,这意味着每个子进程都通过其pid进行标识。
使用kill命令,我们使用pid来选择要杀死的子进程,但是使用killall命令,通过指定名称,因为所有子进程和进程父进程都具有相同的名称,所以将杀死所有进程。

让我们通过一些实际示例来讨论killall命令的用法。

1)列出所有支持的信号

Kill命令支持一些信号,这些信号可以用“ -l”选项列出。
killall向进程发送信号。
我们可以使用“ -s”选项(后跟信号名称)将特定信号发送到进程。

$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

缺省情况下,如果未将信号发送给killall命令,则将SIGTERM/TERM(15)发送到进程。
上面的信号对于用户和系统管理员都是有用的。
因此,killall支持所有这些信号。

2)杀死一个特定的进程

要终止进程,我们需要对其进行识别以检查其是否正在运行。
我们可以用它的名字杀死一个特定的进程。
假设有两个具有相同初始字符的进程:

$ps -aef | grep "test"
 himanshu 3969 2811 0 14:14 pts/0 00:00:00 ./test
 himanshu 3970 2811 0 14:14 pts/0 00:00:00 ./test_again

现在,这是我们可以使用killall命令杀死'test_again'的方法:

$killall test_again
 [2]+ Terminated ./test_again

如我们所见,killall命令终止了“ test_again”过程。
这也可以通过ps命令确认:

$ps -aef | grep "test"
 himanshu 3969 2811 0 14:14 pts/0 00:00:00 ./test

观察到“ test_again”没有显示在输出中,因为它被杀死了。

3)杀死一个忽略大小写的进程

默认情况下,killall命令区分大小写。
这是一个例子:

$ps -aef | grep "test"
 himanshu 4177 3161 0 14:54 pts/3 00:00:00 ./test
 himanshu 4178 3161 0 14:54 pts/3 00:00:00 ./test_again
 himanshu 4180 3161 0 14:54 pts/3 00:00:00 grep --color=auto test

我们会看到我们所有的流程都是小写的。
让我们尝试取消“ ./test”过程,但我们以大写字母输入名称

$killall TEST
 TEST: no process found

因此,我们可以看到在运行名为“ test”的进程时,killall命令找不到任何名为TEST的进程。
要确保killall命令忽略大小写,请使用'-I'选项。
这是一个例子:

$killall -I TEST
 [1]- Terminated ./test

观察到现在它成功终止了“测试”过程。

4)确认终止进程

killall命令可用于杀死多个进程。

$killall test test_again
 [2]- Terminated ./test_again
 [3]+ Terminated ./test

但是,通过指示其他名称插入进程名称时,可能会出错。
如果指示的过程是系统的关键过程,则可能是一个严重的问题。
因此,建议使用killall通过请求确认以交互方式终止进程。
为此,我们可以使用“ -i”选项。

$killall -i test test_again
 Kill test(4201) ? (y/N) y
 Kill test_again(4202) ? (y/N) y
 [1]- Terminated ./test
 [2]+ Terminated ./test_again

因此,我们可以看到用户可以使用killall命令控制进程的终止。

5)安静地杀死进程

有时,当killall无法找到指定的进程时,它会在输出中抱怨相同的进程。

这是一个例子:

$killall TEST
 TEST: no process found

但是,如果我们希望killall安静地执行其工作,则可以使用'-q'选项:

$killall -q TEST
$

因此,我们可以看到使用-q时,输出被抑制了。

6)killall命令的奇怪结果

killall命令的手册页指出,默认情况下,仅当完整名称的长度小于或者等于15个字符时,它才与完整名称匹配。
因此,如果命令名称的长度超过15个字符,则全名可能不可用(即已被换出)。
在这种情况下,killall将杀死前15个字符内匹配的所有内容。

例如,假设有以下两个具有长名称的过程:

$ps -aef | grep "test"
 himanshu 4021 3161 0 14:27 pts/3 00:00:00 ./test_abcdefghij
 himanshu 4035 3161 0 14:27 pts/3 00:00:00 ./test_abcdefgh

上面输出中的第一个进程的名称中恰好有15个字符。
让我们尝试使用killall命令将其杀死:

$killall test_abcdefghij
 [1]- Terminated ./test_abcdefghij

因此,我们可以看到killall命令成功杀死了该进程。

现在,根据手册页,如果两个名称都具有超过15个匹配字符,则killall将杀死名称后跟有'-e'选项的进程,否则它将杀死前15个字符内匹配的所有内容。
这是一个例子:

$ps -aef | grep "test"
 himanshu 4114 3161 0 14:40 pts/3 00:00:00 ./test_abcdefghijklmnopqrstuvwx
 himanshu 4141 3161 0 14:46 pts/3 00:00:00 ./test_abcdefghijklmnopqrstuvwxyz
 himanshu 4143 3161 0 14:46 pts/3 00:00:00 grep --color=auto test

观察到这两个进程的名称现在都超过了15个匹配字符。
现在,当我尝试使用killall杀死第二个进程时:

$killall test_abcdefghijklmnopqrstuvwxyz
 [6]+ Terminated ./test_abcdefghijklmnopqrstuvwxyz

它仅杀死指定的进程,而不杀死第二个进程

$ps -aef | grep "test"
 himanshu 4114 3161 0 14:40 pts/3 00:00:00 ./test_abcdefghijklmnopqrstuvwx
 himanshu 4146 3161 0 14:47 pts/3 00:00:00 grep --color=auto test

我不确定我这边是否有不正确的地方,或者是killall命令中的错误。
如果我们在注释中对此提出意见,我将不胜感激。

顺便说一句,这是我系统上的killall命令的详细信息:

$killall --version
killall (PSmisc) 22.20
Copyright (C) 1993-2012 Werner Almesberger and Craig Small
PSmisc comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it under
the terms of the GNU General Public License.
For more information about these matters, see the files named COPYING.