我需要写一个 1 行,它会 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 语句为真或假时。当我输入"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
在这种情况下,当 if 给出真或假时,也会发送电子邮件。我懂一点编程,但我是 bash 的初学者。任何关于我做错了什么的建议将不胜感激。
我需要编写一个 1 行,它将 ping 服务器并发送一个 没有回复时发送电子邮件。
你似乎有复杂的事情。 只需检查ping
状态:
subject="Host_down";
if ! ping -c1 -w3 100.100.100.100; then
mail -s $subject admin@example.com < file.txt;
fi
如果ping
返回非零退出代码,则将执行 mail
命令。
编辑:正如Chepner所指出的,一个双引号的字符串前面有一个美元符号($
)将导致字符串根据当前的语言环境进行翻译。 所以你可能想说:
subject="Host_down"
而不是说
subject=$"Host_down"
您的问题在于:
j=$(echo $i | wc -l) ;
其内容应为:
j=$(echo -n $i | wc -l) ;
-n
将禁止显示echo
放置的换行符,即使$i
为空也是如此。所以现在wc -l
将正确返回0
而不是1
.
您的"工作"版本,即您说"if
语句工作正常,仅在服务器关闭时输出$i
"可能不起作用:当服务器启动时,会打印一个空行。