我想使用 ping 检查服务器是否已启动。我将如何执行以下操作:
ping $URL
if [$? -eq 0]; then
echo "server live"
else
echo "server down"
fi
我将如何完成上述工作?另外,我将如何使它在第一个 ping 响应时返回 0,或者如果前十个 ping 失败则返回错误?或者,是否有更好的方法来完成我在上面尝试做的事情?
我建议不要只使用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 22
for 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
只收听,不发送数据
-w
timeout
如果连接和标准输入的空闲时间超过 timeout 秒,则连接会静默关闭。(在这种情况下nc
将退出 1 -> 失败。)
(可选)-n
如果您只使用 IP:不要对任何指定的地址、主机名或端口进行任何 DNS 或服务查找。
&> /dev/null
不要打印出命令的任何输出
你可以使用这样的东西 -
serverResponse=`wget --server-response --max-redirect=0 ${URL} 2>&1`
if [[ $serverResponse == *"Connection refused"* ]]
then
echo "Unable to reach given URL"
exit 1
fi
将 -c 选项与 ping 一起使用,它只会 ping URL 给定的次数或直到超时
if ping -c 10 $URL; then
echo "server live"
else
echo "server down"
fi
简写:
ping -c5 $SERVER || echo 'Server down'
您需要它用于其他脚本吗?或者试图破解一些简单的监控工具?在这种情况下,您可能需要查看 Pingdom:https ://www.pingdom.com/ 。
我使用以下脚本函数来检查服务器是否在线。当您要检查多个服务器时,它很有用。该功能隐藏 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