我有一个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
在顶部添加然后运行它。