无网络连接时重启不行!

无网络连接时重启不行!

我有一个 Raspberry Pi,用作本地网络的 NAS。它工作正常,但是当我关闭 pi 连接的路由器时,它会永久失去连接。为了能够再次连接到网络,必须重新启动它。因此我写了这个脚本:

#!/bin/bash

if ! ping -q -w 1 -c 1 $(ip r | grep default | cut -d ' ' -f 3)
then
        service networking restart

        sleep 60

        if ! ping -q -w 1 -c 1 $(ip r | grep default | cut -d ' ' -f 3)
        then
                reboot
        fi
fi

它基本上会尝试 ping 路由器。如果失败,它将重新启动网络服务(当发生简单错误并且不需要重新启动时)。如果仍然无法 ping 通路由器,则会重新启动。我将其设置为每 10 分钟执行一次 cronjob,但它不起作用。我究竟做错了什么?

我把这一行放在 crontab 中:

0,10,20,30,40,50 * * * * /root/rebooter.sh >> rebooter.log 2>&1

没有连接,这是输出:

Usage: ping [-LRUbdfnqrvVaAD] [-c count] [-i interval] [-w deadline]
            [-p pattern] [-s packetsize] [-t ttl] [-I interface]
            [-M pmtudisc-hint] [-m mark] [-S sndbuf]
            [-T tstamp-options] [-Q tos] [hop1 ...] destination
/root/rebooter.sh: Line 5: service: Command not found.
Usage: ping [-LRUbdfnqrvVaAD] [-c count] [-i interval] [-w deadline]
            [-p pattern] [-s packetsize] [-t ttl] [-I interface]
            [-M pmtudisc-hint] [-m mark] [-S sndbuf]
            [-T tstamp-options] [-Q tos] [hop1 ...] destination
/root/rebooter.sh: Line 11: reboot: Command not found.

连接后,输出如下:

PING 192.168.178.1 (192.168.178.1) 56(84) bytes of data.

--- 192.168.178.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.985/0.985/0.985/0.000 ms

答案1

我认为问题出在你的if表述上。

if ! ping -q -w 1 -c 1 $(ip r | grep default | cut -d ' ' -f 3)

进一步来说:

ping -q -w 1 -c 1 $(ip r | grep default | cut -d ' ' -f 3)

主机ip未正确传递。

请注意,每个部分都独立工作(即ping hostip r....)。

这对我来说一直有效:

$ ip r | grep "default" | cut -d ' ' -3 | xargs ping -q -w 1 -c 1

尝试将其与您的if陈述结合起来。 xargs获取之前管道的输出并将其用于ping,而之前 ip 并未传递到ping代码的一半。在命令行中尝试一下:-)

更改为netstatrathern,ip r它也适用于 Pi,但足够通用,可以在其他 Linux 发行版上使用。

下面的脚本:

0它正确地获取要 ping 的主机名,并在出现(输入,即设备断开连接时)的情况下输入语句。

if还用括号重新构造了语句[],并为更清晰的语句分配了一个变量。

#!/bin/bash

test_host=`netstat -nr | grep "UG" | awk '{ print $2}' | xargs ping -q -w 1 -c 1 | grep "received" | awk '{ print $4 }'`
if [ "$test_host" == "0" ] || [ -z "$test_host" ] ;
then
    echo "service networking restart"

    sleep 60
    test_host=`netstat -nr | grep "UG" | awk '{ print $2}' | xargs ping -q -w 1 -c 1 | grep "received" | awk '{ print $4 }'`
    if [ "$test_host" == "0" ] || [ -z "$test_host" ] ;
    then
            echo "reboot"
    fi
fi

相关内容