6

我想使用 ping 检查服务器是否已启动。我将如何执行以下操作:

ping $URL
if [$? -eq 0]; then
    echo "server live"
else
    echo "server down"
fi

我将如何完成上述工作?另外,我将如何使它在第一个 ping 响应时返回 0,或者如果前十个 ping 失败则返回错误?或者,是否有更好的方法来完成我在上面尝试做的事情?

4

6 回答 6

10

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

更好地使用这些替代方案:

卷曲

男人卷曲

您可以使用curl并检查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

在哪里

  • HOST= [您主机的 ip 或 dns 名称]

  • (可选) PORT= [可选端口;不要忘记从:]开始

  • 200是正常成功http_response

  • 403是一个重定向,例如可能是一个登录页面,所以也可以接受,并且很可能意味着服务运行正确

  • -s静音或静音模式。

  • -L定义位置

  • -w您希望以哪种格式显示响应
    ->%{http_code}\n我们只需要 http_code

  • -o输出文件
    ->/dev/null将任何输出重定向到 /dev/null 所以它不会被写入标准输出或check变量。通常您会在 http_response 之前获得完整的 html 源代码,因此您也必须将其静音。


数控

男人数控

虽然curl对我来说似乎是 Webservices 的最佳选择,因为它确实在检查服务的网页是否正常工作,

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

这里的优点是可设置的超时,例如 1 秒,而 curl 可能需要更长的时间才能失败,当然您也可以检查不是网页的服务,如 port 22for SSH

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只收听,不发送数据

  • -wtimeout
    如果连接和标准输入的空闲时间超过 timeout 秒,则连接会静默关闭。(在这种情况下nc将退出 1 -> 失败。)

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

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

于 2018-01-11T08:48:35.493 回答
9

你可以使用这样的东西 -

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

if [[ $serverResponse == *"Connection refused"* ]]
then
    echo "Unable to reach given URL"
    exit 1
fi
于 2013-04-12T20:31:44.623 回答
8

将 -c 选项与 ping 一起使用,它只会 ping URL 给定的次数或直到超时

if ping -c 10 $URL; then
    echo "server live"
else
    echo "server down"
fi
于 2013-04-12T20:35:49.047 回答
5

简写:

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

您需要它用于其他脚本吗?或者试图破解一些简单的监控工具?在这种情况下,您可能需要查看 Pingdom:https ://www.pingdom.com/ 。

于 2013-04-26T00:34:40.610 回答
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
于 2015-05-04T10:04:11.407 回答
2

一个好的解决方案是将 MRTG(*NIX 的一个简单的绘图工具)与 ping-probe 脚本一起使用。在谷歌上查找。

这个开始。

示例图:

示例图

于 2015-05-04T10:09:21.140 回答