我正在尝试弄清楚为什么当命令从 cron 触发脚本启动时我的 VPN 无法连接,而相同的脚本和命令却按预期工作。
我有一台远程服务器,它使用安全 VPN 隧道 (pptp) 连接到防火墙后面的数据库。这是一个相当稳定的系统(尤其是persistent
设置了选项的情况下),并且通常运行没有任何问题。但是,从我们的 ISP 到我们办公室的连接有时会断开,并且这种断开时间足以阻止 VPN 隧道保持打开状态。
我已经建立了一个简单的脚本来检测防火墙数据库是否仍然可通过 VPN 访问,如果不可用,它会尝试重新打开 VPN。
#!/bin/bash
DATE=`date`
HOST=10.1.2.1
PING_RESULT=`ping -c4 $HOST`
# gets the percentage of lost packets
PING_LOSS=`echo $PING_RESULT : | grep -oP '\d+(?=% packet loss)'`
echo "$DATE : Loss Result : $PING_LOSS"
# if 100% packet loss on the ping - assume connection lost
if [ "100" -eq "$PING_LOSS" ];
then
echo "$DATE : Connection Lost"
pon VPN_TUNNEL
echo "$DATE : Restarted Connection"
else
echo "$DATE : Connection OK"
fi
我已将脚本保存为/root/cron/pptp-monitor
并将权限设置为-rwxr--r-- root root
该脚本在手动运行(使用 sudo)时运行良好 - 但我配置的 cron 无法正常工作:
*/5 * * * * root [ -x /root/cron/pptp-monitor ] && /root/cron/pptp-monitor >> /var/log/pptp-monitor.log 2>&1
监视脚本运行 - 我每 5 分钟查看一次日志条目 - 但pon
命令实际上似乎并没有触发。
在系统日志中,我每 5 分钟会看到一次这样的情况:
Apr 17 08:45:01 bombur CRON[774]: (root) CMD ( [ -x /root/cron/pptp-monitor ] && /root/cron/pptp-monitor >> /var/log/pptp-monitor.log 2>&1)
Apr 17 08:45:14 bombur pppd[784]: pppd 2.4.5 started by root, uid 0
Apr 17 08:45:14 bombur pppd[784]: Using interface ppp0
Apr 17 08:45:14 bombur pppd[784]: Connect: ppp0 <--> /dev/pts/0
Apr 17 08:45:14 bombur pppd[784]: Modem hangup
Apr 17 08:45:14 bombur pppd[784]: Connection terminated.
之前重复了 10 次“使用接口 ppp0”到“连接终止”这几行exit
- 表明隧道正在尝试重新打开,但没有成功。注意 - 此时网络连接正常,只要我手动运行命令,它就会在第一次尝试时连接。
我错过了什么导致 cron 触发器阻止 VPN 连接?
答案1
您需要PATH
在脚本中声明变量,之后它才会起作用。在文件顶部(以及crontab
将要执行的脚本):
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
答案2
我更喜欢运行这个:
# Here we can specify which user do crontab use.
# And, we can change $PATH by edit this file directly
vi /etc/crontab
# I'm using centos, restart cron daemon
service crond restart
然后运行这个:
# Edit crontab directly, we can't specify the user.
# And I'm not sure changing $PATH is available or not.
# The default value of $PATH may be `/sbin:/bin:/usr/sbin:/usr/bin'
crontab -e
因为 pppd 将运行 pptp,但是 pptp 位于 `/usr/sbin/',所以设置 $PATH 是必要的。