Bashスクリプトが1時間後に突然動作を停止します。

Bashスクリプトが1時間後に突然動作を停止します。

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

このスクリプトの問題は、約1時間ほどうまく機能し、突然ファイルに表示されることです。/tmp/All_IPs_this_boot、動作が停止します。何も書きません。/tmp/All_IPs_this_boot。また、プロセスが実行されていることがわかるので、実行されていないのではなく、1時間後にスクリプトが機能しないため、手動で再起動する必要があるということです。VPN

答え1

以下を追加して、スクリプト全体を効果的に置き換えることができます。一つルートのcrontabには次の行があります。

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

指定されたコマンドは1分ごとに実行されます。

特にskypeプロセスが実行されていない場合、restart-vpn.shスクリプトは1分ごとに実行されます。

このスクリプトの内容restart-vpn.shも1行にまとめる必要があります。

また、それおそらくルートアクセスは必要ありません。


ところで、あなたは上記のスクリプトとスクリプトの間の一種の「魔法のインターフェース」としてファイルと/tmp/ipファイルを使用しているようです。コマンドラインパラメータを渡す方法を学びます。/tmp/All_IPs_this_bootrestart-vpn.sh


シェルスクリプトが何をするのかを確認する最も簡単な方法は、set -x一番上に追加して実行することです。

関連情報