我有一个代码,其中bash脚本ping主机并在主机不响应时发送电子邮件。
HOSTS="google.pl"
COUNT=1
SUBJECT="Ping failed"
EMAILID="me@mydomain.com"
for myHost in $HOSTS
do
count=$(ping -c $COUNT $myHost | grep 'received' | awk -F',' '{ print $2 }' | awk '{ print $1 }')
if [ $count -eq 0 ]; then
echo "Host : $myHost is down (ping failed) at $(date)" | mail -s "$SUBJECT" $EMAILID
fi
done
可以制作一个crontab每小时检查一次,等等。 但是我需要一个脚本来每5分钟对服务器执行一次ping操作,如果服务器不能正常运行(仅3次丢包),则每隔5分钟对服务器进行一次ping操作,并在开始工作时发送第二封电子邮件。也许保存一些状态到文件,如果更改发送电子邮件?有人知道怎么做吗? 我在stackoverflow上发现了很少的主意,但是没有人在丢包时发送电子邮件,只有在重新开始工作时才发送电子邮件。
答案 0 :(得分:1)
这是一种快速而肮脏的尝试,它将每个故障的时间戳存储在日志文件中,并检查最近的故障是否是最新的。
我还自由地重构了许多shell编程反模式。
#!/bin/bash
# Don't use uppercase for your private variables
hosts="google.pl"
count=1
subject="Ping failed"
emailid="me@mydomain.com"
# Start up correctly the first time
test -s fail.log || echo 0 >fail.log
if (($(tail -n 1 fail.log) + 3600 < $(date +%s)); then
# Last failure is too recent, abandoning
exit 0
fi
for myHost in $hosts
do
if ! ping -c "$count" "$myHost" |
awk -F , '/received/ { split($2, s); r=1-s[1] } END { exit r }'
then
echo "Host : $myHost is down (ping failed) at $(date)" |
mail -s "$subject" "$emailid"
date +%s >>fail.log
fi
done
使Awk在失败时返回1,然后从中反转结果代码的逻辑有些折磨,但同时也说明了如何正确使用if
。
如果其中一个失败,将停止检查hosts
中的所有站点一个小时。也许您希望逻辑工作有所不同,或者调整时间安排,等等。
答案 1 :(得分:0)
Monit是一个很好的开源和免费工具,可以帮助您实现这一目标。 我个人在项目中使用了它,并且它还有一个简单而漂亮的仪表板。
尝试一下-Kubernetes - setting custom permissions/file ownership per volume (and not per pod)