Cronjob调用Shell脚本发送空邮件

时间:2015-09-22 13:58:02

标签: linux bash shell crontab sendmail

我编写了一个shell脚本,用于检查存储设备中的文件系统,并将输出邮寄给特定的电子邮件。当我手动执行它时,它运行正常,我收到有效内容的电子邮件。但是,当我将它放在同一用户的cronjob中时,它会发送空邮件。我无法找出遗失的内容。即使我为root用户安排了cronjob,同样的问题仍然存在。以下是我的剧本:

$ 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 个答案:

答案 0 :(得分:1)

首先,为什么不使用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

答案 1 :(得分:0)

您在一个文件夹中运行它(您或运行该作业的用户)无权写入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