Bash скрипт внезапно перестает работать через час

У меня есть bash скрипт, который я действительно не могу заставить работать. Скрипт должен прежде всего менять VPN каждые X-минуты, а затем также, если мое соединение падает, менять 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
15.11.2016, 14:23
1 ответ

Весь этот сценарий можно эффективно заменить, добавив одну единственную строку ниже в crontab пользователя root:

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

Будет запущена указанная команда каждую минуту.

В частности, каждую минуту, если процесс skype не запущен, будет запускаться сценарий restart-vpn.sh .

Содержимое этого сценария restart-vpn.sh , вероятно, также следует объединить в одну строку.

Кроме того, вероятно не требует прав root.


Кстати, похоже, что вы используете файл / tmp / ip и файл / tmp / All_IPs_this_boot как своего рода «волшебный интерфейс» между показанным скриптом выше и сценарий restart-vpn.sh . Пожалуйста, научитесь вместо этого передавать аргументы командной строки.


Самый простой способ увидеть, что делает сценарий оболочки, - это добавить вверху set -x , а затем запустить его.

1
28.01.2020, 05:10

Теги

Похожие вопросы