gpt4 book ai didi

linux - bash 进程监控脚本在找不到进程时回显为空

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:45:34 25 4
gpt4 key购买 nike

我创建了一个进程监视器来检查是否存在正在运行的进程,如果发现我们需要检查其父进程以确定它是否可接受,这基本上是一种安全检查。当我寻找正在运行的进程并提供我期望的输出时,它非常有用。但是,出于某种原因,当没有找到任何进程时,它会吐出一个空行而不是像我期望的那样“确定”。我知道如果没有进程正在运行,变量 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 工作原理的误解有关,所以我正在突破到一个点,即我回显一个空的“结果”变量然后终止,我只是不确定。

提前致谢!

最佳答案

问题是 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

关于linux - bash 进程监控脚本在找不到进程时回显为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37596145/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com