Tenho dois servidores em minha rede e transfiro alguns dados de um servidor para outro. Escrevi um script para fazer isso e funciona bem quando o executo manualmente. Porém, quando eu o incluo no crontab para automatizar o processo, ele não monta o servidor externo mesmo que o script seja executado. Envio o máximo de informações possível para um log, mas nenhum erro de montagem é relatado, apenas o fato de ele não ter se conectado.
Este é o roteiro:
#!/bin/bash
LOGFILE="/var/log/SRV1.log"
echo $(date +%Y-%m-%d_%H:%M:%S)" --- Begins Now" | tee -a ${LOGFILE}
StartTime="$(date +%s)"
echo "Connecting to SRV1" | tee -a ${LOGFILE}
mount.cifs //192.168.1.200/share /media/SVR1 -o user=username,pass=pwd | tee -a ${LOGFILE}
O arquivo pertence a root:root com 755 permissões. (Eu sei que poderia restringir isso, mas ainda estou apenas experimentando).
Responder1
O cron
programa é executado em um ambiente muito limitado - você pode ver isso, por exemplo, se criar um crontab contendo
* * * * * /usr/bin/printenv > /tmp/cronenv
e observe o arquivo resultante:
$ cat /tmp/cronenv
LANGUAGE=en_CA:en
HOME=/home/steeldriver
LOGNAME=steeldriver
PATH=/usr/bin:/bin
LANG=en_CA.UTF-8
SHELL=/bin/sh
PWD=/home/steeldriver
O mesmo se aplica aos root
crontabs (ou seja, trabalhos enviados usando sudo crontab -e
):
LANGUAGE=en_CA:en
HOME=/root
LOGNAME=root
PATH=/usr/bin:/bin
LANG=en_CA.UTF-8
SHELL=/bin/sh
PWD=/root
Em particular, o padrão PATH
contém apenas /bin
e /usr/bin
; isso seria bom para mount
:
$ which mount
/bin/mount
no entanto, isso não funcionará, mount.cifs
por exemplo, já que está em /usr/sbin
:
$ which mount.cifs
/sbin/mount.cifs
A solução é:
sempre use o caminho absoluto completo para programas executáveis em scripts a serem executados como cron jobs; por exemplo
/usr/sbin/mount.cifs //192.168.1.200/share /media/SVR1 -o user=username,pass=pwd | tee -a ${LOGFILE}
ou
adicione uma tarefa adequada
PATH
no topo de tais scripts, por exemploPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
NOTA: Os trabalhos executados no /etc/cron.d
diretório do sistema têm um caminho mais extenso definido explicitamente em /etc/crontab
:
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin