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)
为什么?如何解决这个问题?
该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
)。