如何检查服务器是否正在运行

8
我想使用ping来检查服务器是否正常运行。我该如何执行以下操作:
ping $URL
if [$? -eq 0]; then
    echo "server live"
else
    echo "server down"
fi

我该如何完成上述任务?另外,如何使它在第一次Ping响应时返回0,或者如果前十个ping失败则返回错误?或者,有没有更好的方法来完成我尝试做的事情?


1
请在您的 [] 周围添加空格,或者仅编写以下代码:if ping $URL ; then - Basile Starynkevitch
1
(当然,您不能ping一个URL,只能ping服务器。) - tripleee
@tripleee 它只会是成功或失败。成功=服务器响应,失败=服务器无响应(经过n次尝试后)。 - David542
@tripleee感谢您的澄清,您如何进行单个ping操作? - David542
在许多平台上,ping -c 1 - tripleee
显示剩余2条评论
6个回答

15

我建议不要仅使用 ping。它可以检查服务器是否在线,但无法检查该服务器上的特定服务。

最好使用以下替代方案:

curl

curl手册

您可以使用 curl 并检查像这样的 webservice 的 http_response

check=$(curl -s -w "%{http_code}\n" -L "${HOST}${PORT}/" -o /dev/null)
if [[ $check == 200 || $check == 403 ]]
then
    # Service is online
    echo "Service is online"
    exit 0
else
    # Service is offline or not working correctly
    echo "Service is offline or not working correctly"
    exit 1
fi

where

  • HOST = [主机的IP地址或DNS名称]

  • (可选)PORT = [端口号,记得以:开头]

  • 200是正常的成功http响应

  • 403是重定向,例如可能是到登录页面,所以也可以接受,并且很有可能表示服务正在正确运行

  • -s 静默模式.

  • -L 定义位置。

  • -w 你想要以什么格式显示响应
    -> %{http_code}\n我们只想要http_code

  • -o 输出文件
    -> /dev/null将任何输出重定向到/dev/null,以便不会写入stdout或检查变量。通常,在http响应之前您会获得完整的html源代码,因此您也必须使其静音。


nc

nc手册

对于Web服务而言,curl似乎是最好的选择,因为它真正检查服务的网页是否正常工作,

nc可用于快速检查目标上的特定端口是否可达(并假设这也适用于该服务)。

在此处的优势是可设置的超时时间,例如1秒钟,而curl可能需要更长时间才能失败,并且当然您还可以检查不是像SSH端口22那样的网页服务。

nc -4 -d -z -w 1 ${HOST} ${PORT} &> /dev/null
if [[ $? == 0 ]]
then
    # Port is reached
    echo "Service is online!"
    exit 0
else
    # Port is unreachable
    echo "Service is offline!"
    exit 1
fi

其中

  • HOST = [您的主机的IP地址或DNS名称]

  • PORT = [必填项端口号]

  • -4 强制使用IPv4(或-6使用IPv6)

  • -d 不尝试从标准输入读取数据

  • -z 仅监听,不发送数据

  • -w 超时时间
    如果连接和标准输入在超过超时时间后没有活动,则连接会被静默关闭。(在这种情况下,nc将返回1 -> 失败。)

  • (可选项)-n 如果只使用IP:不对任何指定的地址、主机名或端口进行DNS或服务查找。

  • &> /dev/null 不打印出任何命令输出。


10

你可以使用类似这样的代码 -

serverResponse=`wget --server-response --max-redirect=0 ${URL} 2>&1`

if [[ $serverResponse == *"Connection refused"* ]]
then
    echo "Unable to reach given URL"
    exit 1
fi

如果问题确实想知道它是否可达和正在提供服务,则返回+1。 - msw
我支持这个答案,因为如果涉及代理(这在我的情况下是必须的),使用ping的方法会失败。 - John Red

8

使用ping命令的-c选项,可以仅对指定的URL进行一定次数的ping测试或直到超时。

if ping -c 10 $URL; then
    echo "server live"
else
    echo "server down"
fi

@HussainAkhtarWahid'Ghouri' ping 在 Windows 上也可以工作,据我所知。 - A human being
我的意思是,我们要把这个放在批处理文件里吗? - Hussain Akhtar Wahid 'Ghouri'
我认为你需要在命令提示符中运行它,我没有Windows的经验,所以无法更好地回答你,抱歉! - A human being
不要直接在Windows上运行,反正不用管它。 - Hussain Akhtar Wahid 'Ghouri'

5

缩写:

ping -c5 $SERVER || echo 'Server down'

你需要它用于其他脚本吗?或者你想要攻击某些简单的监控工具吗?如果是这样,你可以看一下Pingdom:https://www.pingdom.com/


4
我使用以下脚本函数来检查服务器是否在线。当您想要检查多个服务器时,它非常有用。该函数隐藏了ping输出,并且您可以分别处理服务器存活或服务器宕机的情况。
#!/bin/bash

#retry count of ping request
RETRYCOUNT=1;

#pingServer: implement ping server functionality. 
#Param1: server hostname to ping
function pingServer {
  #echo Checking server: $1
  ping -c $RETRYCOUNT $1 > /dev/null 2>&1
  if [ $? -ne 0 ]
  then
    echo $1 down
  else
    echo $1 live
  fi
}

#usage example, pinging some host
pingServer google.com
pingServer server1

2

一个好的解决方案是使用 MRTG(*NIX 上的一种简单图形化工具)和 ping-probe 脚本。在谷歌上搜索了解更多。

阅读这篇文章作为起点。

样例图:

样例图


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接