1.第一种情况(processName 作为来自 cmd 即 java 的参数)
来自 cmd 的带有参数的命令:./a.sh getProcessId 包含 java
代码:
getProcessId(){
matchType=$1
#defaulting matchArg to x i.e exact match
matchArg=x
processName=$2
if [[ $matchType == 'contains' ]];then
matchArg=f
elif [[ $matchType == 'exact' ]];then
matchArg=x
fi
if processId=`pgrep -$matchArg $processName`
then
log $selectedLogLevel "process id fetch is successful" 1 "getProcessId"
else
log $selectedLogLevel "process id fetched is blank" 1 "getProcessId"
fi
echo "$processId"
}
输出 :2 PIDS
第二种情况(processName 作为全局变量,即 java))
进程名称='java'
获取进程ID()
matchType=$1 #defaulting matchArg to x i.e exact match matchArg=x if [[ $matchType == 'contains' ]];then matchArg=f elif [[ $matchType == 'exact' ]];then matchArg=x fi if processId=`pgrep -$matchArg $processName` then log $selectedLogLevel "process id fetch is successful" 1 "getProcessId" else log $selectedLogLevel "process id fetched is blank" 1 "getProcessId" fi echo "$processId" }
输出 :它仅返回 1 个被执行的 PID。
我的要求是从参数中传递进程名称,然后它应该只返回 1 个 PID。目前我得到了 2 个 PID
答案1
我们已经在这里回答了这个问题:shell 脚本中的 pgrep -f 返回 2 pid 而不是 1
返回的第二个 PID 是运行脚本的进程的 PID。要实现这一点,您必须修改脚本,使其检测自己的命令行,并且不返回该 PID。