状态更改时如何ping页面并发送电子邮件?

时间:2019-01-31 12:28:16

标签: bash

我有一个代码,其中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上发现了很少的主意,但是没有人在丢包时发送电子邮件,只有在重新开始工作时才发送电子邮件。

2 个答案:

答案 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)