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
Другие вопросы по тегам