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