Bash脚本来检测服务器何时关闭或离线


17

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

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

Answers:


24

如果您有单独的服务器在其上运行检查脚本,则将执行以下类似的操作来执行简单的Ping测试,以查看服务器是否处于活动状态:

#!/bin/bash
SERVERIP=192.168.2.3
NOTIFYEMAIL=test@example.com

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

您可以将脚本设置为定期运行。

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

这是发送到SMS网关的电子邮件的列表:

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

如果您的服务器是可公开访问的网络服务器,则可以使用一些免费服务来监视您的网站,并在出现故障时向您发出警报,请在网络上搜索免费的网站监视以查找一些内容。


您能否详细说明SMS警报消息?
Mh Mahbubur Ra​​hman 2012年

4
代替对服务器进行ping操作,您应该测试关心服务器的功能。例如,如果它是邮件服务器,那么成功发送和接收邮件就更为重要。
吉姆·巴黎

我没有回答应用程序检测,因为该问题未指定服务器上正在运行什么服务-他要求进行服务器启动/关闭检测。可以检测到数百种常见服务,并且可以使用无限数量的自定义应用程序。听起来他有一个正在监视服务的本地服务监视器(系统负载)。
约翰尼2012年

对我而言,Ping几乎毫无用处。我的服务器宕机了,但返回的3个数据包中有3个返回,最终返回值为0。为什么?本地计算机返回“目标主机不可达”数据包。
AlastairG

@AlastairG-最好将其作为一个问题,因为注释中没有足够的空间来回答它。但是先搜索该站点,看看是否有人提出了类似的问题,您可能会在此处找到答案。
约翰尼

9

Ping是一种选择,但是在许多情况下,一台计算机将能够发送ping答复,而实际上所有有关的服务器都已关闭。最好进行端到端测试。在下面的示例中,从Web服务器请求了一个页面。

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

#!/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文档,并使de php脚本测试数据库连接,文件系统等,则您甚至可以测试服务器的更多方面。这样,您可以开始主动监视计算机(在使服务器崩溃之前先查看问题)。

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


如果您已将root电子邮件转发到收件箱,则在crontab中执行此脚本时不必发送sendmail(因为它将将stdout发送给您)
pscheit

5

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

#!/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

我必须适应在Mac上运行/usr/bin/mail -s "$SERVER went down" "$SENDEREMAIL" "$SMSEMAIL"
MikeiLL 2015年

这个解决方案肯定可以工作,但是。(1)如果您在本地计算机上调用此命令,我想它会告诉您apache已死,尽管我不会这样做。(2)如果您在本地计算机上使用此工具,并且网络中断,或者此设备与边缘服务器之间的某个东西或其他东西,您将不会收到电子邮件,或者它将不知道有问题。(3)如果你使用这个另一台机器上,你的curl命令将需要很长的时间,以时间,除非指定,因此ifyou在看多张主机会停顿下来..
麦克Q

1

我强烈建议使用Nagios,它是用于监视和警报任何所需服务的基础结构(许多插件可用,您可以编写自己的插件)。当然,它可以执行简单的ping操作来检查服务器的可用性,但是正如其他人指出的那样,最好检查服务的可用性(例如,网络,电子邮件等)(nagios可以轻松做到)。


这是一个很棒的产品,我想知道有关安全性的问题
Mike Q
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.