Назад | Перейти на главную страницу

Cronjob не может выполнить smartctl?

У меня установлен cronjob (Ubuntu 16), который работает с пользователем root. Так что в

sudo crontab -e

У меня есть такая запись:

10 5 * * mon /home/userA/raidchecker.sh

И сценарий raidchecker.sh Является ли это:

#!/bin/sh
mail=`which mail`
rec="myemail@gmail.com anotheremail@gmail.com"
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

Когда я выполняю скрипт вручную из оболочки ./raidchecker.sh письмо содержит всю ожидаемую информацию.

Когда cronjob выполняет сценарий, параметры disk1, disk2, disk1f и disk2f пусты (не содержат никаких данных).

Зачем?

При использовании crontab большая часть обычной среды, установленной для обычного входа пользователя в систему, отсутствует или сокращается (если вы ее не установили), когда сценарий запускается автоматически с помощью cron.

Конечно, лучше либо предоставить релевантный PATH, или укажите абсолютный путь ко всем командам.

Всегда проверяйте crontab (устанавливая время на пару минут позже текущего времени).

  • Если вы хотите получать (по электронной почте) стандартный вывод, а также вывод ошибок, добавьте только 2>&1 к команде в crontab
  • Если вы это сделаете не хотите получить любой вывод команды crontab (по электронной почте), добавьте > /dev/null 2>&1

Решением было использовать /usr/sbin/smartctl вместо того smartctl в сценарии, только так cronjob мог выполнить эту команду.