Cronjob não consegue executar smartctl?

Cronjob não consegue executar smartctl?

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.shfaz 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.sho 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/smartctlem vez de smartctlno 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 PATHou 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>&1ao comando no crontab
  • Se você fizernãodeseja receber qualquer saída do comando crontab (por e-mail), adicione> /dev/null 2>&1

informação relacionada