Bash 脚本一小时后突然停止工作

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

通过添加以下内容可以有效地替换整个脚本单身的root 的 crontab 的下面一行:

* * * * * 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。请学习传递命令行参数。


查看 shell 脚本正在执行的操作的最简单方法是set -x在顶部添加然后运行它。

相关内容