用于检测我的服务器何时关闭或脱机的 Bash 脚本

用于检测我的服务器何时关闭或脱机的 Bash 脚本

背景:当我的服务器关闭时,我需要收到警报。当服务器关闭时,Sysload 收集器可能无法发送任何警报。为了在服务器关闭时收到警报,我有一个外部源(服务器)来检测它。

问题:有什么方法(我更喜欢 bash 脚本)来检测我的服务器何时关闭或离线并发送警报消息(电子邮件 + 短信)?

答案1

如果您有一个单独的服务器来运行检查脚本,类似这样的操作将执行一个简单的 Ping 测试来查看服务器是否处于活动状态:

#!/bin/bash
SERVERIP=192.168.2.3
[email protected]

ping -c 3 $SERVERIP > /dev/null 2>&1
if [ $? -ne 0 ]
then
   # Use your favorite mailer here:
   mailx -s "Server $SERVERIP is down" -t "$NOTIFYEMAIL" < /dev/null 
fi

您可以 cron 脚本定期运行。

如果您没有 mailx,则必须用您拥有的任何命令行电子邮件程序替换该行,并且可能会更改选项。如果您的运营商提供短信电子邮件地址,您可以将电子邮件发送到该地址。例如,对于 AT&T,如果您发送电子邮件至电话号码@txt.att.net,它会将电子邮件发送到您的手机。

以下是发送至 SMS 网关的电子邮件列表:

http://en.wikipedia.org/wiki/List_of_SMS_gateways

如果您的服务器是可公开访问的网络服务器,则有一些免费服务可以监控您的网站并在网站关闭时向您发出警报,请在网络上搜索免费网站监控找到一些。

答案2

Ping 是一种选择,但在许多情况下,机器能够发送 ping 回复,而其所涉及的实际服务器却已关闭。最好进行端到端测试。在下面的示例中,从网络服务器请求一个页面。

如果它是一个网络服务器,它看起来像这样:

#!/bin/bash
wget -qO /dev/null 'http://webserver/some_existing_short_document.html' || {
    echo "Webserver down"
    # another mailer example
    sendemail -s mailserverip -f 'from@localhost' -t 'user@localhost' -u 'Webserver down' -m 'The webserver is down'
}

如果将html文档更改为php文档,并使用php脚本测试数据库连接、文件系统等内容,您甚至可以测试服务器的更多方面。这样您就可以开始主动监控机器(在问题导致服务器崩溃之前发现问题)。

与检查邮件服务器类似,但您无需请求网页,只需通过邮件服务器发送电子邮件并查看邮箱中是否收到它

答案3

这是我解决同样问题的方法

#!/bin/bash
NOTIFYEMAIL=<your email>
SMSEMAIL=<cell phone number @ sms-gateway>
SENDEREMAIL=alert@localhost
SERVER=http://127.0.0.1/
PAUSE=60
FAILED=0
DEBUG=0

while true 
do
/usr/bin/curl -sSf $SERVER > /dev/null 2>&1
CS=$?
# For debugging purposes
if [ $DEBUG -eq 1 ]
then
    echo "STATUS = $CS"
    echo "FAILED = $FAILED"
    if [ $CS -ne 0 ]
    then
        echo "$SERVER is down"

    elif [ $CS -eq 0 ]
    then
        echo "$SERVER is up"
    fi
fi

# If the server is down and no alert is sent - alert
if [ $CS -ne 0 ] && [ $FAILED -eq 0 ]
then
    FAILED=1
    if [ $DEBUG -eq 1 ]
    then
        echo "$SERVER failed"
    fi
    if [ $DEBUG = 0 ]
    then
        echo "$SERVER went down $(date)" | /usr/bin/mailx -s "$SERVER went down" -r "$SENDEREMAIL" "$SMSEMAIL" 
        echo "$SERVER went down $(date)" | /usr/bin/mailx -s "$SERVER went down" -r "$SENDEREMAIL" "$NOTIFYEMAIL" 
    fi

# If the server is back up and no alert is sent - alert
elif [ $CS -eq 0 ] && [ $FAILED -eq 1 ]
then
    FAILED=0
    if [ $DEBUG -eq 1 ]
    then
        echo "$SERVER is back up"
    fi
    if [ $DEBUG = 0 ]
    then
        echo "$SERVER is back up $(date)" | /usr/bin/mailx -s "$SERVER is back up again" -r "$SENDEREMAIL" "$SMSEMAIL"
        echo "$SERVER is back up $(date)" | /usr/bin/mailx -s "$SERVER is back up again" -r "$SENDEREMAIL" "$NOTIFYEMAIL"
    fi
fi
sleep $PAUSE
done

答案4

我强烈推荐使用纳吉奥斯,它是用于监视和警报您想要的任何服务的基础设施(有许多可用的插件,您可以编写自己的插件)。它当然可以执行简单的 ping 来检查服务器可用性,但正如其他人指出的那样,最好检查服务可用性(例如网络、电子邮件等)(nagios 可以轻松做到)。

相关内容