네트워크 연결이 없을 때 다시 시작하면 작동하지 않습니다!

네트워크 연결이 없을 때 다시 시작하면 작동하지 않습니다!

로컬 네트워크의 NAS로 사용하는 Raspberry 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 hostsum ip r....).

이것은 항상 나에게 효과적이었습니다.

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

이를 귀하의 진술에 연결하십시오 if. xargs이전 파이프의 출력을 가져와 pingIP가 ping코드의 절반에 전달되지 않고 사용합니다. 명령줄에서 시도해 보세요 :-)

netstat오히려 변경하면 ip rPi에서도 작동하지만 다른 Linux 배포판에서도 사용할 수 있을 만큼 일반적입니다.

아래 스크립트:

0ping할 호스트 이름을 올바르게 가져오고 입력(입력, 즉 장치 연결이 끊어진 경우)이 발생하면 명령문을 입력합니다.

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

관련 정보