除了来自 /tmp 之外,将通配符与“killall”一起使用不起作用

Muh*_*kur 0 bash process kill wildcards

我有/tmp/bash.sh一个包含这样的脚本:

killall name*
Run Code Online (Sandbox Code Playgroud)

如果我转到/tmp文件夹然后运行它可以正常工作./bash.sh,但是如果我转到/然后运行它/tmp/bash.sh或者./tmp/bash.sh它不起作用。相反,它抱怨

name*: no process found
Run Code Online (Sandbox Code Playgroud)

为什么?如何解决这个问题?

Kus*_*nda 6

killall实用程序不采用模式,它采用一个或多个进程名称的列表来发送信号。

当您说killall name*shell 将不带引号的文件名通配模式扩展name*到当前目录中与该模式匹配的所有文件名时,会发生什么。

您显然有一些文件名/tmp与此模式匹配,并且也对应于您想要杀死的进程。当没有匹配的文件名时,就像/系统上的目录中似乎没有一样,您的 shell 会保留未扩展的模式。该killall实用程序找不到任何调用的进程name*,并以您在问题中报告的方式抱怨该进程。


对于更符合您预期的pkill实用程序,请考虑该实用程序。有了它,您可以根据与名称匹配的扩展正则表达式向进程发送信号。

以下将向TERM名称以开头的所有进程发送信号name(请注意,该模式通常应被引用):

pkill '^name'
Run Code Online (Sandbox Code Playgroud)

向名称name完全匹配的进程发送信号:

pkill '^name$'
Run Code Online (Sandbox Code Playgroud)

或更好,

pkill -x name
Run Code Online (Sandbox Code Playgroud)

还要考虑提供给进程的参数,请使用-f选项 with pkill,例如cat通过键入cat myfile以下内容来终止您启动的命令:

pkill -f -x 'cat myfile'
Run Code Online (Sandbox Code Playgroud)

另请参阅pkill手册 ( man pkill)。