Não é possível montar outro servidor no crontab com 16.04

0

Eu tenho dois servidores na minha rede e transfiro alguns dos dados de um servidor para o outro. Eu escrevi um script para fazer isso e funciona bem quando eu o executo manualmente. No entanto, quando eu incluo no crontab para automatizar o processo, ele não montará o servidor externo mesmo que o script seja executado. Eu envio o máximo possível de informações para um log, mas nenhum erro de montagem é relatado, apenas o fato de que ele não se conectou.

Este é o script:

#!/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 é de propriedade root: root com 755 permissões. (Eu sei que poderia apertar isso, mas ainda estou apenas experimentando).

    
por Rick 27.05.2017 / 15:14

1 resposta

0

O programa cron é executado em um ambiente muito limitado - você pode ver, por exemplo, se você cria um crontab contendo

* * * * * /usr/bin/printenv > /tmp/cronenv

e, em seguida, 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 a 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á para mount.cifs , por exemplo, pois está em /usr/sbin :

$ which mount.cifs
/sbin/mount.cifs

A solução é:

  1. sempre use o caminho absoluto completo para programas executáveis em scripts a serem executados como tarefas agendadas; por exemplo,

    /usr/sbin/mount.cifs //192.168.1.200/share /media/SVR1 -o user=username,pass=pwd | tee -a ${LOGFILE}
    

ou

  1. adicione uma designação PATH adequada na parte superior desses scripts, por exemplo,

    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
    

NOTA: As tarefas executadas a partir do diretório /etc/cron.d 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
    
por steeldriver 27.05.2017 / 21:06