当我尝试将我的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
答案 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