Bash 스크립트가 한 시간 후에 갑자기 작동을 멈춥니다.

Bash 스크립트가 한 시간 후에 갑자기 작동을 멈춥니다.

bash실제로 작동할 수 없는 스크립트 가 있습니다 . 스크립트를 먼저 변경해야 합니다.VPN모든엑스-몇 분 후 연결이 끊어지면 전송됩니다.VPN. 스크립트는 다음과 같습니다.

re='^[0-9]+$'

sudo rm -rf /tmp/All_IPs_this_boot
sudo -u frederik touch /tmp/All_IPs_this_boot

while :
do
    # Restart the VPN, however, only if skype is not running!
    if ! [[ $(pidof skype) =~ $re ]] ; then
        sudo bash 'restart-vpn.sh' &
    else
        echo "Error: Skype is running"
    fi

    # Generate random overall sleep time before restart is forced
    TimesOverall=$(shuf -i 35-65 -n 1)
    echo "Times to check: $TimesOverall"    

    # Will check whether the restart worked
    n=1
    while [[ $n -le $TimesOverall ]]; do
        # Choose "random" website to ping
        rand=$(shuf -i1-5 -n1)
        if [ $rand == 1 ]; then
            Website=$(echo "duckduckgo.com")
        elif [ $rand == 2 ]; then
            Website=$(echo "pingmyurl.com")
        elif [ $rand == 3 ]; then
            Website=$(echo "ping.eu")
        elif [ $rand == 4 ]; then
            Website=$(echo "lenovo.com")
        else
            Website=$(echo "archlinux.org")
        fi

        if [[ $(ping -4 -c 3 $Website | \
                sed '1d' | sed -n 1,4p | cut -c1-14 | \
                awk '{printf("%s", $0 (NR==1 ? "" : ""))}') \
              == "64 bytes from 64 bytes from 64 bytes from " ]]
        then
            { echo -e "IP is $(cat /tmp/ip) at $(date '+%d-%m %H:%M:%S')"; \
              cat "/tmp/All_IPs_this_boot"; } > "/tmp/All_IPs_this_boot.new"
            mv "/tmp/All_IPs_this_boot.new" "/tmp/All_IPs_this_boot"        
            sleep 20
            ((n++))
        else
            sleep 6

            # Choose "random" website to ping
            rand=$(shuf -i1-5 -n1)
            if [ $rand == 1 ]; then
                Website=$(echo "duckduckgo.com")
            elif [ $rand == 2 ]; then
                Website=$(echo "pingmyurl.com")
            elif [ $rand == 3 ]; then
                Website=$(echo "ping.eu")
            elif [ $rand == 4 ]; then
                Website=$(echo "lenovo.com")
            else
                Website=$(echo "archlinux.org")
            fi

            if [[ $(ping -4 -c 4 $Website | 
                    sed '1d' | sed -n 1,4p | cut -c1-14 | \
                    awk '{printf("%s", $0 (NR==1 ? "" : ""))}') \
                  == "64 bytes from 64 bytes from 64 bytes from 64 bytes from " ]]
            then
                { echo -e "IP is $(cat /tmp/ip) at $(date '+%d-%m %H:%M:%S')"; \
                  cat "/tmp/All_IPs_this_boot"; } > "/tmp/All_IPs_this_boot.new"
                mv "/tmp/All_IPs_this_boot.new" "/tmp/All_IPs_this_boot"                    
                sleep 20
                ((n++))
            else
                break
            fi
        fi
    done
done

이 스크립트의 문제점은 약 한 시간 정도 잘 작동하다가 갑자기 파일에서 볼 수 있다는 것입니다./tmp/All_IPs_this_boot, 작동이 중지됩니다. 아무것도 쓰지 않습니다./tmp/All_IPs_this_boot. 또한 프로세스가 실행되는 것을 볼 수 있으므로 실행되지 않는 것이 아니라 한 시간 후에 스크립트가 작동하지 않아 수동으로 다시 시작해야 한다는 것입니다.VPN.

답변1

다음을 추가하여 전체 스크립트를 효과적으로 바꿀 수 있습니다.하나의루트의 crontab에 다음 줄이 있습니다:

* * * * * pidof skype >/dev/null 2>&1 || /path/to/restart-vpn.sh

지정된 명령이 1분마다 실행됩니다.

특히 skype프로세스가 실행되고 있지 않으면 restart-vpn.sh스크립트가 1분마다 실행됩니다.

이 스크립트의 내용 restart-vpn.sh도 한 줄로 결합되어야 할 것입니다.

또한, 그것은아마도루트 액세스가 필요하지 않습니다.


그런데, 당신은 위에 표시된 스크립트와 스크립트 사이의 일종의 "마법 인터페이스"로 파일 /tmp/ip과 파일을 사용하고 있는 것 같습니다 . 명령줄 매개변수를 전달하는 방법을 배우십시오./tmp/All_IPs_this_bootrestart-vpn.sh


쉘 스크립트가 수행하는 작업을 확인하는 가장 쉬운 방법은 set -x맨 위에 추가한 다음 실행하는 것입니다.

관련 정보