我需要写一个内线来ping服务器,并在没有响应时发送电子邮件。我到目前为止写了这个
subject=$"Host_down" ;
i=$(ping -c1 -w3 100.100.100.100 | grep 100%) ;
j=$(echo $i | wc -l) ;
if [ $j -eq 1 ] ; then mail -s $subject admin@example.com < file.txt ; fi
但是当if语句为true或false时,它会在两种情况下都发送电子邮件。当我把“echo $ i”代替“mail ...”时,就像那样
subject=$"Host_down" ;
i=$(ping -c1 -w3 100.100.100.100 | grep 100%) ;
j=$(echo $i | wc -l) ;
if [ $j -eq 1 ] ; then echo $i ; fi
然后if语句正常工作,并在服务器关闭时输出$ i。
我也试过这个
subject=$"Host_down" ;
i=$(ping -c1 -w3 100.100.100.100 | grep 100%) ;
j=$(echo $i | wc -l) ;
if [ $j -eq 1 ] ; then echo $i | mail -s $subject admin@example.com ; fi
在这种情况下,如果给出true或false,也会发送电子邮件。我知道编程有点但我是bash的初学者。任何关于我做错的建议都将受到高度赞赏。
答案 0 :(得分:4)
我需要写一个1个班轮,它会ping服务器并发送一个 没有回复时发送电子邮件。
你似乎有复杂的事情。只需检查ping
状态:
subject="Host_down";
if ! ping -c1 -w3 100.100.100.100; then
mail -s $subject admin@example.com < file.txt;
fi
如果mail
返回非零退出代码,则会执行ping
命令。
编辑:noted作为chepner,以美元符号($
)开头的双引号字符串会导致字符串为translated according to the current locale。所以你可能想说:
subject="Host_down"
而不是说
subject=$"Host_down"
答案 1 :(得分:1)
你的问题在于:
j=$(echo $i | wc -l) ;
应该是:
j=$(echo -n $i | wc -l) ;
即使-n
为空,echo
也会阻止$i
提出的换行符。因此,现在wc -l
将正确返回0
而不是1
。
您的“工作”版本,其中您说“if
语句正常工作,并在服务器关闭时输出$i
”可能不工作:服务器启动,打印出一个空行。