
Eu tenho um cronjob instalado (Ubuntu 16) que roda com o usuário root. Então em
sudo crontab -e
Eu tenho a seguinte entrada:
10 5 * * mon /home/userA/raidchecker.sh
E o script raidchecker.sh
faz isso:
#!/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
Quando executo o script manualmente a partir do shell, ./raidchecker.sh
o email contém todas as informações conforme o esperado.
Quando o cronjob executa o script, os parâmetros disk1, disk2, disk1f e disk2f estão vazios (não contêm nenhum dado).
Por que?
Responder1
A solução foi usar /usr/sbin/smartctl
em vez de smartctl
no script, só assim o cronjob poderia executar este comando.
Responder2
Usando um crontab, a maior parte do ambiente usual definido para um login de usuário regular está ausente ou reduzido (a menos que você o defina), quando o script é executado automaticamente pelo cron
.
Com certeza, é melhor fornecer um arquivo relevante PATH
ou fornecer o caminho absoluto para todos os comandos.
Sempre teste um crontab (definindo um horário alguns minutos após o horário atual).
- Se você deseja receber (por e-mail) a saída padrão e também de erro, basta adicionar
2>&1
ao comando no crontab - Se você fizernãodeseja receber qualquer saída do comando crontab (por e-mail), adicione
> /dev/null 2>&1