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

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

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 cronprograma é 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 rootcrontabs (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 PATHcontém apenas /bine /usr/bin; isso seria bom para mount:

$ which mount
/bin/mount

no entanto, isso não funcionará, mount.cifspor exemplo, já que 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 cron jobs; 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 tarefa adequada PATHno topo de tais scripts, por exemplo

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

NOTA: Os trabalhos executados no /etc/cron.ddiretó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

informação relacionada