如何使用ping返回值来触发一个bash命令

我试图让我的openvpn客户端重新启动,如果它不能ping通目标4.2.2.2每60秒,如果它然后什么都不做。 这是我的。 我也想继续运行。我正在Alpine Linux上运行。 任何帮助是极大的赞赏。

#!/bin/sh #This is a script to continuously do 5 pings to 4.2.2.2 #every 60 seconds to keep the tunnel up if pings fail, #then it will restart the openvpn process. And record the #time it failed. PING=ping -w 5 4.2.2.2 exec &> /var/log/ping_SLA while true do if #ping returns a fail value [ $PING -eq 0 ]; sleep 60s then #Execute commands date > /var/log/ping_SLA_Fail rc-service openvpn stop killall -9 openvpn rc-service openvpn start sleep 30s else # colon is a null and is required : fi done 

我不熟悉ping的任何-w选项。

对ping命令使用-c选项来确定要发送的ICMP回显请求的数量。

像这样的东西应该工作:

 if ! ping -c 5 4.2.2.2 &> /dev/null; then date >> /var/log/ping_SLA_Fail rc-service openvpn stop killall -9 openvpn rc-service openvpn start fi sleep 60 

男子平:

 -c count 

发送ECHO_REQUEST数据包后停止。 使用截止期限选项,ping等待ECHO_REPLY数据包计数,直到超时到期。

 -s packetsize 

指定要发送的数据字节数。 缺省值为56,与8个字节的ICMP头数据结合时,转换为64个ICMP数据字节。

 -w deadline 

无论有多少个数据包已发送或接收,在ping之前指定一个以秒为单位的超时时间。 在这种情况下,在发送计数包之后,ping不会停止,它会等待截止日期到期,或者直到计数探测器得到应答,或者等待来自网络的一些错误通知。

 -W timeout 

等待响应的时间,以秒为单位。 该选项只影响任何响应中的超时,否则ping等待两个RTT。

所以我们有:

 ping -c 1 -s 1 -W 1 4.2.2.2 1>/dev/null 2>&1 #The fast way to ping #OR : nmap -sP 1 4.2.2.2 1 1>/dev/null 2>&1 #The fastest way to ping if [ $? -eq 0 ]; then date >> /var/log/ping_SLA_Fail rc-service openvpn stop killall -9 openvpn rc-service openvpn start sleep 30 elif [ $? -ne 0 ]; then . . . fi 

您必须运行ping命令,然后测试其退出值:

 ping -w 5 4.2.2.2 > /dev/null 2>&1 if [ $? -eq 0 ]; then echo "Ping worked" else echo "Ping failed" fi