bash 进程监控脚本在找不到进程时回显为空
bash process monitor script echo empty when no process found
我创建了一个进程监视器来检查 运行 进程是否存在,如果发现我们需要检查其父进程以确定它是否可接受,这基本上是一种安全检查。当我查找 运行 进程并提供我期望的输出时,它非常有效。但是,由于某种原因,当找不到任何进程时,它会吐出一个空行,而不是像我期望的那样 "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,然后是 echo,然后是 else 和 echo,它似乎工作正常,所以我觉得这与 main 中的循环有关,如果这导致了一些我看不到的错误。或者,这可能与对 break 工作原理的误解有关,所以我正在突破到一个点,我回显一个空的 "result" 变量然后终止,我只是不确定。
提前致谢!
问题是 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
我创建了一个进程监视器来检查 运行 进程是否存在,如果发现我们需要检查其父进程以确定它是否可接受,这基本上是一种安全检查。当我查找 运行 进程并提供我期望的输出时,它非常有效。但是,由于某种原因,当找不到任何进程时,它会吐出一个空行,而不是像我期望的那样 "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,然后是 echo,然后是 else 和 echo,它似乎工作正常,所以我觉得这与 main 中的循环有关,如果这导致了一些我看不到的错误。或者,这可能与对 break 工作原理的误解有关,所以我正在突破到一个点,我回显一个空的 "result" 变量然后终止,我只是不确定。
提前致谢!
问题是 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