У меня установлен 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 > /dev/null 2>&1
Решением было использовать /usr/sbin/smartctl
вместо того smartctl
в сценарии, только так cronjob мог выполнить эту команду.