【问题标题】:Cronjob invoking a Shell script sending empty mailsCronjob 调用 Shell 脚本发送空邮件
【发布时间】:2015-09-22 22:48:29
【问题描述】:

我编写了一个 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

【问题讨论】:

  • 我的怀疑是,在其中一个通道甚至 filesystem_list 的位置中,某些东西取决于丢失的环境变量。通常是$HOME。在 qmon.sh 中沿途添加更多输出以帮助诊断,例如在for i 之前,做echo looping through list 等。
  • 如果以| 结束行,则不需要反斜杠; shell 将知道命令在下一行继续,因为命令不能以管道结束。
  • 不要 iterate over a file 使用 for 循环。
  • cron 是否向运行 cron 作业的用户发送任何电子邮件?

标签: linux bash shell crontab sendmail


【解决方案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

【讨论】:

    【解决方案2】:

    您在您(或运行该作业的用户)无权写入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
    

    【讨论】:

      猜你喜欢
      • 2011-07-06
      • 2010-12-21
      • 1970-01-01
      • 2018-02-11
      • 2010-12-19
      • 1970-01-01
      • 2020-04-15
      • 2014-10-13
      • 2016-11-22
      相关资源
      最近更新 更多