No se puede montar otro servidor en crontab con 16.04

No se puede montar otro servidor en crontab con 16.04

Tengo dos servidores en mi red y transfiero algunos de los datos de un servidor al otro. Escribí un script para lograr esto y funciona bien cuando lo ejecuto manualmente. Sin embargo, cuando lo incluyo en crontab para automatizar el proceso, no montará el servidor externo aunque se ejecute el script. Envío tanta información a un registro como sea posible, pero no se informan errores de montaje, solo el hecho de que no se conectó.

Este es el guión:

#!/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}

El archivo es propiedad de root:root con 755 permisos. (Sé que podría ajustar eso, pero todavía estoy experimentando).

Respuesta1

El cronprograma se ejecuta en un entorno muy limitado; puede verlo, por ejemplo, si crea un crontab que contenga

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

y luego mira el archivo 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

Lo mismo se aplica a rootlos crontabs (es decir, trabajos enviados mediante 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

En particular, el valor predeterminado PATHsólo contiene /biny /usr/bin; eso estaría bien para mount:

$ which mount
/bin/mount

sin embargo, eso no funcionará, mount.cifspor ejemplo, ya que está en /usr/sbin:

$ which mount.cifs
/sbin/mount.cifs

La solución es:

  1. utilice siempre la ruta absoluta completa para que los programas ejecutables en los scripts se ejecuten como trabajos cron; p.ej

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

o

  1. agregue una tarea adecuada PATHen la parte superior de dichos scripts, por ejemplo

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

NOTA: Los trabajos ejecutados desde el /etc/cron.ddirectorio del sistema tienen una ruta más extensa establecida explícitamente en /etc/crontab:

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

información relacionada