Você precisa declarar a variável PATH
em seus scripts, depois ela funcionará.
Na parte superior dos arquivos (o crontab
e o script que será executado):
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
Estou tentando descobrir por que minha VPN não se conecta quando o comando é iniciado a partir de um script acionado por cron quando o mesmo script e comando funcionam da maneira esperada.
Eu tenho um servidor remoto que usa um túnel VPN seguro (pptp) para se conectar a um banco de dados atrás do nosso firewall. É um sistema bastante estável (especialmente com o conjunto de opções persistent
) e geralmente é executado sem nenhum problema. No entanto, de tempos em tempos, a conexão do nosso ISP para o nosso escritório desaparece, e essa desconexão é longa o suficiente para impedir que o túnel da VPN permaneça aberto.
Eu configurei um script simples para detectar se o banco de dados com firewall ainda está disponível na VPN e, se não, ele tenta reabrir a 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
Guardei o script como /root/cron/pptp-monitor
e defino as permissões como -rwxr--r-- root root
O script funciona bem quando executado manualmente (usando o sudo) - mas o cron que eu configurei não funciona corretamente:
*/5 * * * * root [ -x /root/cron/pptp-monitor ] && /root/cron/pptp-monitor >> /var/log/pptp-monitor.log 2>&1
O script do monitor é executado - vejo as entradas de log a cada 5 minutos - mas o comando pon
não parece disparar.
No syslog, vejo isso a cada 5 minutos:
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.
As linhas "usando interface ppp0" para "conexão terminada" são repetidas 10 vezes antes de exit
- indicando que o túnel está tentando reabrir sem êxito. Observação - a conexão de rede está correta até o momento e, assim que eu executar o comando manualmente, ele se conectará na primeira tentativa.
O que eu perdi que está causando o gatilho cron para impedir a conexão VPN?
Você precisa declarar a variável PATH
em seus scripts, depois ela funcionará.
Na parte superior dos arquivos (o crontab
e o script que será executado):
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
Eu prefiro executar isto:
# 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
Do que executar isto:
# 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
Como o pppd irá rodar o pptp, mas o pptp está localizado em '/ usr / sbin /', então o $ PATH pode ser necessário.