除了 /tmp 之外,使用带有“killall”的通配符不起作用

除了 /tmp 之外,使用带有“killall”的通配符不起作用

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

killall name*

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

name*: no process found

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

答案1

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

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

显然,您有一些文件名与/tmp此模式匹配,并且与您想要终止的进程相对应。

当没有匹配的文件名时,就像/系统上的目录中似乎没有匹配的文件名一样,您的 shell 不会展开该模式。该killall实用程序找不到任何被调用的进程name*,并以您在问题中报告的方式抱怨这一点。


对于工作方式更像您期望的实用程序,请考虑该pkill实用程序。有了它,您可以根据扩展正则表达式匹配他们的名字。

以下代码会将TERM信号发送到名称以以下字符开头的所有进程name(请注意,该模式通常应加引号):

pkill '^name'

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

pkill '^name$'

或更好,

pkill -x name

要同时考虑为进程提供的参数,请使用-f带有 的选项pkill,例如cat通过键入以下命令来终止您启动的命令cat myfile

pkill -f -x 'cat myfile'

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

相关内容