¿Cronjob no puede ejecutar smartctl?
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.shhace 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.shel correo electrónico contiene toda la información como se esperaba.
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é?
Respuestas
El uso de un crontab, la mayor parte del conjunto entorno habitual, por un inicio de sesión de usuario normal está ausente o reducida (a menos que establezca ella), cuando el script se ejecuta automáticamente por cron.
Sin duda, es mejor proporcionar una PATHruta relevante o la ruta absoluta a todos los comandos.
Siempre pruebe un crontab (estableciendo una hora un par de minutos después de la hora actual).
- Si desea recibir (por correo electrónico) el estándar y también la salida de error, solo agregue
2>&1al comando en el crontab - Si no desea recibir ninguno de los resultados del comando crontab (por correo electrónico), agregue
> /dev/null 2>&1
La solución fue usar en /usr/sbin/smartctllugar de smartctlen el script, solo de esta manera el cronjob podría ejecutar este comando.