
Tengo un cronjob instalado (Ubuntu 16) que se ejecuta con el usuario root. Entonces en
sudo crontab -e
Tengo la siguiente entrada:
10 5 * * mon /home/userA/raidchecker.sh
Y el guión raidchecker.sh
hace esto:
#!/bin/sh
mail=`which mail`
rec="[email protected] [email protected]"
now=$( date +%Y%m%d-%H%M-%S )
mdstat=$( cat /proc/mdstat )
details=$( /sbin/mdadm --detail /dev/md2 )
diskusg=$( df -kh )
disk1=$( smartctl -A /dev/sda | grep Realloc | grep Sector )
disk2=$( smartctl -A /dev/sdb | grep Realloc | grep Sector )
disk1f=$( smartctl -A /dev/sda )
disk2f=$( smartctl -A /dev/sdb )
buddyinfo=$( cat /proc/buddyinfo | grep Normal )
echo "Check from $now\n\n=================\nMemory Fragmentation:\n$buddyinfo\n\nAll partitions:\n\n$mdstat\n\n=================\nData Partition:\n\n$details\n\n=================\nDisk Usage:\n$diskusg\n\n=================\nSMARTCTL:\n\nData Disk /dev/sda and sdb:\n$disk1\n$disk2\n\nFull Reports:\nDisk1:\n$disk1f\n\nDisk2:\n$disk2f" | $mail -s "Check from $now" $rec
Cuando ejecuto el script manualmente desde el shell, ./raidchecker.sh
el correo electrónico contiene toda la información esperada.
Cuando el cronjob ejecuta el script, los parámetros disk1, disk2, disk1f y disk2f están vacíos (no contienen ningún dato).
¿Por qué?
Respuesta1
La solución fue usar /usr/sbin/smartctl
en lugar de smartctl
en el script, solo así el cronjob podría ejecutar este comando.
Respuesta2
Al utilizar un crontab, la mayor parte del entorno habitual configurado para el inicio de sesión de un usuario normal está ausente o reducido (a menos que lo configure), cuando el script se ejecuta automáticamente mediante cron
.
Sin duda, es mejor proporcionar una ruta relevante PATH
o la ruta absoluta a todos los comandos.
Pruebe siempre un crontab (estableciendo una hora un par de minutos después de la hora actual).
- Si desea recibir (por correo electrónico) la salida estándar y también la de error, solo agréguela
2>&1
al comando en el crontab - Si lo hacesnodesea recibir cualquiera de los resultados del comando crontab (por correo electrónico), agregue
> /dev/null 2>&1