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

时间:2014-02-03 23:14:02

标签: linux bash

我试图让我的openvpn客户端重启,如果它不能每60秒ping一次目标4.2.2.2,如果它什么都不做的话。这就是我所拥有的。我想继续运行。我在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

3 个答案:

答案 0 :(得分:3)

man ping:

-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

答案 1 :(得分:2)

我不熟悉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

答案 2 :(得分:1)

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

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