![Pgrep 返回多个 PID](https://linux22.com/image/25452/Pgrep%20%E8%BF%94%E5%9B%9E%E5%A4%9A%E4%B8%AA%20PID.png)
我的脚本接受进程名称作为输入并杀死它。我尝试使用 pgrep 但它返回两个 PID,一个用于正在运行的进程,一个用于接受进程名称作为输入的脚本,所以我被卡住了!我也尝试使用该pgrep
-fo
选项,但这也没有帮助。任何的意见都将会有帮助。这是我的脚本
#!/bin/bash
ProcessName=$1
pID= pgrep -fl $ProcessName
echo $pID
因此,当我调用脚本时,它返回两个 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
我原本期待的只是 10534,但它也获取了脚本。以防万一操作系统版本:
bash-3.00$ uname -a
Linux xxxxxx 2.6.9-67.0.1.
答案1
几周前我不得不解决同样的问题。pgrep
并pkill
支持扩展正则表达式,因此获得正确的正则表达式很简单。
这是您的脚本以及我使用的正则表达式。
#!/bin/bash
ProcessName=$1
pID= pgrep -fl "^(/.*)?${ProcessName}\s"
echo $pID
尽管使用pkill
(如 Caleb 建议的)更好。
pkill -fl "^(/.*)?${ProcessName}\s"
您可能仍然需要调整正则表达式以获得您的用例所需的结果以及程序的执行方式。
现在,如果有是实际上,以该名称运行的多个进程当然会被杀死。如果你想避免这种情况,你可以使用-o
仅杀死最老的匹配进程或-n
只杀死最新。如果您只想要一个,但既不需要最旧的也不需要最新的,那么您可能不应该使用p(kill|grep)
.
答案2
不会使用
| grep -v $$
从列表中排除您的进程有帮助吗?
答案3
#!/bin/bash
ProcessName=$1
pID=`pgrep -fl $ProcessName`
echo "$pID" | grep -v "^$$"
答案4
如果您排除 #!/bin/bash 那么它不会为该脚本派生另一个进程,但您将无法选择它运行的 shell。 bash 已经足够默认了,那些微笑者应该能够运行它。
但不确定这是否会消除第二个进程 ID。
我知道这并不完整,但已经很晚了,我必须在上午工作,但这“应该”作为一个快速解决方案。