Nagios插件不工作

时间:2014-01-30 12:57:03

标签: bash plugins nagios

当我尝试将我的bash脚本移植到nagios时,我遇到了问题。当我在控制台上运行时,脚本运行正常,但是当我从Nagios运行它时,我得到了msg“(null)” - 在nagios中调试日志我看到它很好地解析了脚本,但它返回错误消息..

我不擅长编写脚本,所以我想我需要一些帮助

该脚本的目标是检查某些服务器的* .ears版本,md5并比较输出以查看版本是否匹配。 为此,我在这些服务器上有一个json,它打印* .ear和他的md5的名称。

所以..脚本的第一部分从带有curl的json获取信息,并在.tempfile上只存储md5号,然后它比较两个临时文件,如果它们匹配,我得到$ STATE_OK消息。如果他们不这样做,它会创建一个带有日期的.datetmp文件(目的是在48h的不一致后打印一条消息)。然后,我做了一个.datetmp文件的差异和我要检查结果是否小于48小时它打印$ STATE_WAR的日子,如果结果超过48小时它打印$ STATE_CRI

脚本的sintaxis是“$ sh script.sh nameoftheear.ear server1 server2”

提前致谢

#/bin/bash

#Variables For Nagios
cont=$1
bas1=$2
bas2=$3

## Here you set the servers hostname
svr1= curl -s "http://$bas1.domain.com:7877/apps.json" | grep -Po '"EAR File":.*? [^\\]",' | grep $cont | awk '{ print $5 }' > .$cont-tmpsvr1
svr2= curl -s "http://$bas2.domain.com:7877/apps.json" | grep -Po '"EAR File":.*? [^\\]",' | grep $cont | awk '{ print $5 }' > .$cont-tmpsvr2
file1=.$cont-tmpsvr1
file2=.$cont-tmpsvr2
md51=$(head -n 1 .$cont-tmpsvr1)
md52=$(head -n 1 .$cont-tmpsvr2)
datenow=$(date +%s)

#Error Msg
ERR_WAR="Not updated $bas1: $cont $md51 --- $bas2: $cont $md52 "
ERR_CRI="48 hs un-updated $bas1: $cont $md51 --- $bas2: $cont $md52 "
OK_MSG="Is up to date $bas1: $cont $md51 --- $bas2: $cont $md52 "

STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2


##Matching md5 Files
if cmp -s "$file1" "$file2"
then
    echo $STATE_OK
    echo $OK_MSG
# I do the rm to delete the date tmp file so i can get the $STATE_OK or $STATE_WARNING
    rm .$cont-datetmp
    exit 0

elif
    echo $datenow >> .$cont-datetmp

#Vars to set modification date

datetmp=$(head -n 1 .$cont-datetmp)
diffdate=$(( ($datenow - $datetmp) /60 ))

#This var is to set the time of the critical ERR

days=$((48*60))

[ $diffdate -lt $days ]

then
    echo $STATE_WARNING
    echo $ERR_WAR
    exit 1
 else
    echo $STATE_CRITICAL
    echo $ERR_CRI
    exit 2
 fi

1 个答案:

答案 0 :(得分:1)

我猜是某种权限问题 - 更具体地说,我不认为nagios用户可以写入自己的主目录。您可以修复这些权限,也可以写入/ tmp中的文件(并考虑使用mktemp?)。 ...但理想情况下,你会跳过编写所有这些文件,据我所知,所有这些比较都可以保存在内存中。

<强>更新

再次查看您的脚本 - 我发现您可以查看一些明显的错误:

  • 您在打印信息之前打印出退出值。
  • 您打印退出值而不是以退出值退出。

...所以这个:

echo $STATE_WARNING
echo $ERR_WAR
exit 1

应该是:

echo $ERR_WAR
exit $STATE_WARNING

此外,我想知道这是否真的是剧本,或者如果你在粘贴时错过了什么。在你的最后一段代码中似乎缺少'if'和多余的换行符?应该是:

if [ $diffdate -lt $days ]
then
  ...
else
  ...
fi