Я пытаюсь понять, почему мой VPN не подключается, когда команда запускается из сценария, запускаемого cron, когда тот же сценарий и команда работают иначе, как ожидалось.
У меня есть удаленный сервер, который использует безопасный VPN-туннель (pptp) для подключения к базе данных за нашим брандмауэром. Это довольно стабильная система (особенно с установленным параметром persistent
), и, как правило, работает без проблем. Однако время от времени соединение от нашего интернет-провайдера с нашим офисом прерывается, и это разъединение является достаточно длинным, чтобы препятствовать тому, чтобы 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.
Строки «использующие интерфейс ppp0» для «соединение прервано» повторяются 10 раз перед exit
- указывая, что туннель пытается возобновить безуспешно. Примечание: к этому времени сетевое соединение в порядке, и как только я запускаю команду вручную, она подключается с первой попытки.
Что я упустил, что заставляет cron-триггер предотвратить VPN-соединение?
Необходимо объявить PATH
переменная в сценариях, впоследствии она будет работать. Наверху файлов (и crontab
и сценарий это будет выполняемым):
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
Я предпочел бы, выполняет это:
# 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 набора может быть необходимым.