Cronjob вызывает скрипт Shell для отправки пустых писем
Я написал сценарий оболочки, который проверяет файловую систему на устройстве хранения и отправляет вывод по электронной почте. Когда я выполняю его вручную, он работает нормально, и я получаю письмо с допустимым содержимым. Однако, когда я помещаю его в cronjob для того же пользователя, он отправляет пустые письма. Я не могу выяснить, чего не хватает. Та же проблема сохраняется, даже если я запланировал cronjob для пользователя root. Ниже мой сценарий:
$ cat qmon.sh
nas_fs -list \
| grep -v ckpt_ \
| grep -v root_ \
| awk '{print $6}' >filesystem_list
for i in `cat filesystem_list`
do
nas_quotas -report -tree -fs $i \
| egrep -i -B18 'mins|day|exp' >>quota_exp
done
cat quota_exp \
| mail -s "FF VNX01 Quota report" storagemgmt@mycompany.com
cat /dev/null >quota_exp
2 ответа
Прежде всего, почему бы вам не использовать встроенные возможности рассылки cron? всякий раз, когда cronjob производит какой-либо вывод, он будет отправлен пользователю, выполняющему задание, по электронной почте.
Это также отлично подходит для отладки, так как в этом случае электронная почта может дать вам подсказку, что пошло не так (например, cron не смог найти qmon.sh
сценарий; или у него не было разрешений для запуска...). Итак, первое, что нужно сделать, это проверить, получил ли пользователь cronttab какое-либо письмо!
Затем вы можете использовать функцию рассылки напрямую, чтобы заменить ваш звонок mail
: просто настройте пользователя crontab для перенаправления писем на нужный адрес.
О скрипте:
- Хорошей практикой является добавление shebang в скрипт, поэтому понятно, какой интерпретатор должен его запустить (
#!/bin/sh
) - Вы используете много временных файлов без уважительной причины, поэтому попробуйте использовать каналы вместо файлов:
Вот пересмотренная версия вашего скрипта:
$ cat qmon.sh
#!/bin/sh
nas_fs -list \
| grep -v ckpt_ \
| grep -v root_ \
| awk '{print $6}' \
| while read fs
do
nas_quotas -report -tree -fs "${fs}" \
| egrep -i -B18 'mins|day|exp'
done
Если вы настаиваете на отправке почты вручную, просто добавьте | mail -s "FF VNX01 Quota report" storagemgmt@example.com
в финал done
Вы запускаете его в папке, где у вас (или у пользователя, выполняющего задание) нет разрешения на запись в quota_exp
файл. Вы могли бы написать в /tmp
, что-то вроде
nas_fs -list |grep -v ckpt_ |grep -v root_ |awk '{print $6}' >/tmp/filesystem_list
for i in `cat /tmp/filesystem_list`;
do nas_quotas -report -tree -fs $i |egrep -i -B18 'mins|day|exp' >>/tmp/quota_exp; done
cat /tmp/quota_exp |mail -s "FF VNX01 Quota report" storagemgmt@mycompany.com
rm /tmp/quota_exp
rm /tmp/filesystem_list