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



我试图使我的OpenVPN客户端重新启动,如果无法每60秒ping目标4.2.2.2 ping,如果它是什么都不做的。这是我拥有的。我也想连续运行。我正在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

man ping:

-c count

发送计数echo_request数据包后停止。有了截止日期选项,ping等待count echo_reply数据包,直到超时到期。

-s packetsize

指定要发送的数据字节数。默认值为56,与ICMP标头数据的8个字节组合时,它转化为64个ICMP数据字节。

-w deadline

在ping退出之前,指定超时,无论已发送或接收多少数据包。在这种情况下,ping在发送计数数据包后不会停止,它要么等待截止日期到期或直到回答计数探针或从网络上进行一些错误通知。

-W timeout

是时候在几秒钟内等待响应。该选项仅在没有任何响应的情况下仅影响超时,否则请等待两个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

相关内容

  • 没有找到相关文章

最新更新