인터넷 연결이 끊어지면 컴퓨터를 다시 시작하십시오.


4

인터넷 연결을 확인하는 작은 bash 스크립트를 작성하려고합니다. 인터넷이 검색되지 않으면 10 분 후에 다시 시도하고 ... 인터넷이 없으면 컴퓨터를 다시 시작합니다. 지금까지 이것을 작성했습니다. 개선 / 효율성 / 더 나은 코드를 제안하는 아이디어는 높이 평가됩니다.

#!/bin/bash
# Script to restart the computer if there is no internet connection 
#   within the next 10 minutes of whenever the script is run, which 
#   I'll setup via crontab to run every half an hour. 

IS=`/bin/ping -c 5 8.8.8.8 | grep -c "64 bytes"`        

if (test "$IS" -gt "2") then                                
        internet_conn="1"
    exit
else
    internet_conn="0"
    sleep 600

    AA=`/bin/ping -c 5 74.125.226.18 | grep -c "64 bytes"`

    if (test "$AA" -gt "2") then                                
        internet_conn="1"
        exit
    else
        sudo shutdown -r now
    fi
fi

3
궁금한 점 : 링크가 다운 될 때 재부팅하는 시점은 무엇입니까? 구글이 IP를 다운 / 리사이클 할 때 ICMP를 더 이상 반환하지 않으면 어떻게 될 것이라고 생각하십니까? 어쨌든 그렇게하고 싶다면 IP를 선택하는 것이 좋습니다 : 8.8.8.8 (google public dns server)
Shadok

1
이 컴퓨터는 스크립트를 사용하여 역방향 ssh 터널을 시작합니다. 때로는 네트워크 문제로 인해 소켓이 오래되고 터널 정지를 통해 활성 연결이 이루어지기 때문에 재부팅하면 모든 것이 새로 시작됩니다. 귀하의 제안에 따라 IP를 변경했습니다. 잘 잡았습니다.
Sparctus

나는 실제 답변이있는 질문을 실제로 보지 못합니다. 아마도 이것이 코드 검토 스택 교환 사이트 로 옮겨 져야 합니까?
Caspar

오, 그런 사이트가 존재한다는 것을 몰랐습니다. 아마도 이동해야합니다.
Sparctus

답변:


2

스크립트가 제대로 작동한다고 생각하지만 하나의 DNS 서버보다 더 많은 장소를 확인하고 싶을 수도 있습니다. 물론, 절대 다운되지 않는 큰 DNS이지만 IP에서 유지 관리 작업을 수행하는 경우 서버를 재부팅하고 싶지 않으므로 세 가지 소스를 확인하고 모두 다운으로 표시되면 다시 시작합니다. 섬기는 사람.

또한 재부팅하는 대신 단순히 인터페이스를 중지하고 백업하는 것이 더 신중할 수 있습니까?


1

작은 제안, 핑이 성공했는지 평가하기 위해 grep이 필요하지 않습니다. Ping은 성공하면 0으로 종료되고 오류가 발생하면 1 이상으로 종료됩니다. 따라서 다음과 같이 스크립트를 작성할 수도 있습니다. $? 변수는 마지막으로 실행 된 명령의 리턴 코드를 보여줍니다.

/bin/ping -c 5 8.8.8.8

if ( $? -ge 1); then
 ......
fi

0

다음은 at다시 확인하기 위해 10 분 안에 일정을 조정 하는 데 사용되는 방법입니다 .

#!/bin/bash
count=${1:-1}
if /bin/ping -c 5 8.8.8.8 2>&/dev/null; then                                
    if [ $count -eq 2 ]; then
        sudo shutdown -r now
    else
        at now + 10 minutes <<< "$0 $((count + 1))"
    fi
fi

감사. 이해하는 데 약간의 어려움이 있습니다. 예를 들면 다음과 같습니다. count = $ {1 : -1} 다른 변수에 지정된 변수와 같은 것입니까?
Sparctus

:-구문은 변수 (설정 $1기본값 ( "1") $ 1이 비어있는 경우에)을 (사용자가 인수를 전달 "") 또는 해제 (사용자가 인수를 제공하지 않았다).
glenn jackman

0

잠시 후 리버스 SSH 터널 "스톨 링"에 대한 귀하의 의견은 아마도 NAT 라우터가 열린 연결 테이블을 최소화하려고 시도하기 때문일 수 있으며 OpenSSH FAQ에 설명 된 "ServerAliveInterval"지시문을 사용하여 해결해야합니다 .

링크가 오랫동안 유휴 상태로있을 때 라우터 / 방화벽이 세션을 어쨌든 적극적으로 정리 (bad!)하여 ServerAliveInterval을 낮추는 경우가 있습니다 ( 참고 : 참고 ).

이 경우의 트릭은 ssh 데몬을 모니터링하고 필요할 때 다시 시작하는 일종의 래퍼를 사용하는 것입니다. autossh 는 정확하게 그렇게하므로 문제를 즉시 해결해야합니다!


참고 : 불안정한 링크에서 keepalive 패킷의 빈도를 높이면 연결이 끊어 질 위험이 있으므로 제한해야합니다. 이는 실제로 TCP ACK 패킷 인 x keepalive 응답 패킷 으로 정의되어 연속적으로 실패했습니다.

링크가 안정적인 경우 서버에서 더 빨리 단절되는 것을 감지 하기 위해 해당 지시문을 편의상 낮추십시오 (현명하게 는 초당 keepalive 패킷이 필요 하지 않음 ).


추신 : 질문에 대한 내 의견을 설명하기 위해 핑을 서비스를 다시 시작하기위한 조건으로 사용하고 소유하지 않은 서버에서 사용하므로 가용성을 보장 할 수 없다는 생각에 약간 반박했습니다. 내일 Google은 에코 핑에 대한 응답을 중지하기로 결정하고 서버는 계속 재부팅됩니다.

"인터넷 연결"이라고 정의한 또 다른 문제는 정의에 따라 대규모 네트워크 모음 이며 단일 엔드 포인트 테스트가 너무 작아서 네트워크 연결에 대한 아이디어를 얻기에는 너무 작을 수 있습니다. 응답 시간 / 가동 시간 등을 추적하는 링크


0

이 답변은 2019 년부터 오는 사람들을위한 것입니다.

@rkokkelk의 답변을 사용하려고했지만 제대로 작동하지 않는 것으로 보이며 bash 문서는 올바르게 읽으면 그 가정을 확인합니다.

따라서 나는 개인적인 접근 방식을 제시합니다 (비효율적이라는 것을 알고 있지만이 방법을 원했습니다).

#!/bin/bash
# Restarts computer after 90 minutes of no internet connection.

/bin/ping -c 20 8.8.8.8

if [ "$(echo $?)" == 1 ]; then
    sleep 15
    /bin/ping -c 20 8.8.4.4

    if [ "$(echo $?)" == 1 ]; then
        sleep 5400

        /bin/ping -c 20 8.8.8.8

        if [ "$(echo $?)" == 1 ]; then
            sleep 15
            /bin/ping -c 20 8.8.4.4

            if [ "$(echo $?)" == 1 ]; then
                shutdown -r now
            else
                exit
            fi
        else
            exit
        fi
    else
        exit
    fi

else
    exit
fi

이 작동합니다 bash version 4.4.12(1)-release.


말할 이유가 없습니다 "$(echo $?)". 그냥 말해 "$?". (그리고 엄밀히 말하면, 반향을 일으키 $?려면 반드시해야합니다 echo "$?".)
Scott

@Scott 그것은 당신이 제안하는 방식으로 작동하지 않았다, 그것이 내가 처음에 생각해 낸 방법 echo입니다.
아키토
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.