我的脚本接受一个进程名称作为输入并终止它。我尝试使用 pgrep 但它返回了两个 PID,一个用于正在运行的进程,另一个用于接受进程名称作为输入的脚本,所以我卡住了!我也尝试使用该pgrep -fo选项,但这也无济于事。任何的意见都将会有帮助。这是我的脚本
#!/bin/bash
ProcessName=$1
pID= pgrep -fl $ProcessName
echo $pID
Run Code Online (Sandbox Code Playgroud)
因此,当我调用脚本时,它会返回两个 PID:
bash-3.00$ ./dynamic_values.sh test-Process
10534 /xxx/xxo/xxx/xxe --run --propFile /application/test/test-Process_Archive.tra --innerProcess
23401 /bin/bash ./dynamic_values.sh test-Process
Run Code Online (Sandbox Code Playgroud)
我期待只有 10534,但它也拿起了脚本。操作系统版本以防万一:
bash-3.00$ uname -a
Linux xxxxxx 2.6.9-67.0.1.
Run Code Online (Sandbox Code Playgroud)
几周前我不得不解决同样的问题。pgrep并pkill支持扩展正则表达式,因此获得正确的正则表达式很简单。
这是您的脚本以及我使用的正则表达式。
#!/bin/bash
ProcessName=$1
pID= pgrep -fl "^(/.*)?${ProcessName}\s"
echo $pID
Run Code Online (Sandbox Code Playgroud)
尽管使用pkill(如 Caleb 建议的)更好。
pkill -fl "^(/.*)?${ProcessName}\s"
Run Code Online (Sandbox Code Playgroud)
您可能仍然需要调整正则表达式以获得您的用例所需的结果以及程序的执行方式。
现在,如果实际上有多个进程以该名称运行,它们当然会被杀死。如果您想避免这种情况,可以使用-o仅终止最旧的匹配进程或-n仅终止最新的进程。如果您只想要一个,但既不需要最旧的也不需要最新的,那么您可能不应该使用p(kill|grep).