我有/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
)。