![네트워크 연결이 없을 때 다시 시작하면 작동하지 않습니다!](https://linux55.com/image/54228/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC%20%EC%97%B0%EA%B2%B0%EC%9D%B4%20%EC%97%86%EC%9D%84%20%EB%95%8C%20%EB%8B%A4%EC%8B%9C%20%EC%8B%9C%EC%9E%91%ED%95%98%EB%A9%B4%20%EC%9E%91%EB%8F%99%ED%95%98%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4!.png)
로컬 네트워크의 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 host
sum ip r....
).
이것은 항상 나에게 효과적이었습니다.
$ ip r | grep "default" | cut -d ' ' -3 | xargs ping -q -w 1 -c 1
이를 귀하의 진술에 연결하십시오 if
.
xargs
이전 파이프의 출력을 가져와 ping
IP가 ping
코드의 절반에 전달되지 않고 사용합니다. 명령줄에서 시도해 보세요 :-)
netstat
오히려 변경하면 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