问题
问题是你已经设置好了-w 0.2
。当值小于1时,截止时间(-w
)和超时(-W
)值将被忽略。这个问题之前已经提到过。当您使用时-w 1
,您的脚本(我对此脚本做了一些修改,以删除无用的位)可以正常工作:
$ ./ping_server.sh
waiting for ServerXY ....................
Server is back online
$ cat ./ping_server.sh
#!/bin/bash
printf "%s" "waiting for ServerXY ..."
while ! ping -c 1 -n -w 1 147.153.237.192 &> /dev/null
do
printf "%c" "."
done
printf "\n%s\n" "Server is back online"
解
明显的解决方法是使用-w 1
。如果您打算使用小于1秒的值,则该timeout
命令应该更好:
$ timeout 0.2 ping -c 1 147.153.237.192
PING 147.153.237.192 (147.153.237.192) 56(84) bytes of data.
64 bytes from 147.153.237.192: icmp_seq=1 ttl=124 time=2.61 ms
--- 147.153.237.192 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 2.612/2.612/2.612/0.000 ms
同样,!
在循环中将它与operator一起使用:
#!/bin/bash
printf "%s" "waiting for ServerXY ..."
while ! timeout 0.2 ping -c 1 -n 147.153.237.192 &> /dev/null
do
printf "%c" "."
done
printf "\n%s\n" "Server is back online"
当然,仅当服务器启动时才显示相反的消息,而当服务器关闭时才报告,例如:
$ while ping -q -c 1 172.16.127.2 >/dev/null ; do sleep 1; done ; echo "Server stopped responding"
Server stopped responding
但是请注意,这并不完美:
我们每秒仅轮询1个数据包。低带宽,低连接性,服务器与客户端对服务器执行ping操作之间的不良硬件将触发循环退出并发出误报通知
我们依赖ping,即使用ICMP回显。防火墙甚至单个服务器都会阻止对ping / ICMP回显的响应。你可以使用nc
的ncat
(这是一个改进版本nc
)。类似于上面循环中的内容,它可以代替ping
:
nc -w5 -z 172.16.127.2 80
这样做是为了在端口80上连接172.16.127.2上的服务器。-z
为避免I / O,只需连接和断开连接即可。-w
报告连接失败之前要等待5秒钟。当然,这对您有控制权的服务器并且您知道端口80是开放的非常有用。可以很好地使用UPD,但是如果有防火墙,则可能首选TCP。
这里的一个隐藏好处是,如果您有某些服务在特定端口上运行(例如,端口80上的HTTP或554上的RTSP),则无法连接到端口可能表示您的服务需要重新启动。
当然,nc
而且ping
可能有点垃圾邮件。更好的方法是让服务器与另一台中央服务器签到,并可能每隔一个小时发送一次定期报告。这样,如果服务器错过了“打卡时间”,则可能会产生错误。更好的方法是使用Nagios之类的服务。但是目前,我们正在进入具有多台服务器的企业级计算领域。如果家里有类似Raspberry Pi的产品,则可能不需要任何复杂的东西。