当我尝试将bash脚本移植到nagios时,我会遇到问题。脚本在我在控制台上运行时正常工作,但是当我从nagios运行它时,我会得到味精"(null)" - 在Nagios调试日志中,我看到它很好地解析了脚本,但它返回了错误msg ..
我不太擅长脚本,所以我想我需要一些帮助
脚本的目的是检查一些服务器的 *ears版本,MD5并比较输出以查看版本是否匹配。为此,我在这些服务器上有一个JSON,它打印了 *.ear和他的MD5的名称。
so ..脚本的第一部分从curl和.tempfile上的MD5号仅存储JSON,然后比较两个临时文件,如果它们匹配,则我获得了$ state_ok msg。如果他们不这样做,它将创建一个带有日期的.datetmp文件(目的是在48小时后打印一条消息)。然后,我将.datetmp文件的差异差异,并且我想检查结果是否小于48小时,它打印出$ state_war,如果结果超过48小时,则打印出$ state_cri
脚本的sintaxis是" $ sh脚本。
预先感谢
#/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
我猜想某种权限问题 - 更具体地说,我认为Nagios用户无法写入其自己的主目录。您要么修复这些权限,要么写入/tmp中的文件(并考虑使用mktemp
?)。...但是理想情况下,您会跳过编写所有这些文件,据我所知,所有这些比较等都可以保存在记忆中。
update
再次查看您的脚本 - 我看到一些明显的错误您可以查看:
- 在打印消息之前,您要打印出退出值。
- 您打印出退出值而不是退出值。
...因此:
echo $STATE_WARNING
echo $ERR_WAR
exit 1
应该是:
echo $ERR_WAR
exit $STATE_WARNING
我也想知道这是否真的是脚本,还是您在粘贴时错过了一些东西。似乎缺少"如果"的" IF",并且在您的上一块代码中也缺少多余的线路断开?应该是:
if [ $diffdate -lt $days ]
then
...
else
...
fi