我已经创建了一个进程监视器来检查是否存在正在运行的进程,如果发现我们需要检查其父进程以确定它是否可接受,那么它基本上是一个安全检查。当我寻找正在运行的进程并为我提供我期望的输出时,它工作得很好。但是,出于某些原因,当没有找到任何进程时,它会吐出一条空行而不是像我期望的那样“ok”。我知道变量rmanRUNNING正在填充0,如果没有进程正在运行,我已经检查过,所以我不确定为什么第一个if语句不只是故障转移到else然后执行echo“ok “关闭之前的线。任何帮助将不胜感激。见下文:
#!/bin/bash
rmanRUNNING=`ps -ef|grep rman|egrep -v grep|wc -l`
if [ "$rmanRUNNING" -gt "0" ]
then
PPIDs=($( ps -oppid= $(pgrep rman)))
kshddPID=($(pgrep -f 'ksh.*/rman_dd.ksh'))
for i in "${PPIDs[@]}"
do
:
for j in "${kshddPID[@]}"
do
:
if [ "$i" == "$j" ]
then
result="ok"
else
result="bad"
break
fi
done
if [ "$result" == "bad" ]
then
break
fi
done
echo "$result"
else
echo "ok"
fi
我必须遗漏一些简单的东西,我似乎无法隔离它,如果我将其简化为只有if当前条件然后回显后跟一个else和一个echo,它似乎正常工作,所以我觉得这与主要内部的循环有关,如果导致一些我看不到的错误。或者,也许它与误解如何工作有关,所以我突然发现我回应一个空的“结果”变量然后终止,我只是不确定。
提前致谢!
答案 0 :(得分:1)
问题是ps -ef | grep rman | grep -v grep
与流程名称rman_check.sh
匹配。因此,当您运行脚本时,$rmanRunning
不是0
,因为它在计算自己。
将pgrep
与-x
选项一起使用,使其与命令名完全匹配,而不是查找子字符串。
#!/bin/bash
rmanRunning=$(pgrep -x rman | wc -l)
if [ "$rmanRUNNING" -gt "0" ]
then
PPIDs=($( ps -oppid= $(pgrep -x rman)))
kshddPID=($(pgrep -f 'ksh.*/rman_dd.ksh'))
for i in "${PPIDs[@]}"
do
:
for j in "${kshddPID[@]}"
do
:
if [ "$i" == "$j" ]
then
result="ok"
else
result="bad"
break
fi
done
if [ "$result" == "bad" ]
then
break
fi
done
echo "$result"
else
echo "ok"
fi
但是,整体逻辑也存在问题。如果您有两个rman_dd.ksh
个流程,并且每个流程都有一个rman
子级,那么当您将一个父级与另一个级别进行比较时,您将报告bad
。一种更简单的方法是只对两个PID列表进行排序并进行比较。
PPIDs=$(pgrep -x rman | sort)
kshddPIDs=$(pgrep -f 'ksh.*rman_dd.ksh' | sort)
if [ "$PPIDs" = "$kshddPIDs" ]
then echo "ok"
else echo "bad"
fi