当没有找到进程时,bash进程监视器脚本回显为空

时间:2016-06-02 15:29:11

标签: linux bash loops conditional ps

我已经创建了一个进程监视器来检查是否存在正在运行的进程,如果发现我们需要检查其父进程以确定它是否可接受,那么它基本上是一个安全检查。当我寻找正在运行的进程并为我提供我期望的输出时,它工作得很好。但是,出于某些原因,当没有找到任何进程时,它会吐出一条空行而不是像我期望的那样“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,它似乎正常工作,所以我觉得这与主要内部的循环有关,如果导致一些我看不到的错误。或者,也许它与误解如何工作有关,所以我突然发现我回应一个空的“结果”变量然后终止,我只是不确定。

提前致谢!

1 个答案:

答案 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