如果输出存在,​​如何发送cron输出

时间:2014-12-19 12:15:58

标签: bash shell cron

我有最简单的bash脚本MEM.SH来监控RAM状态

#!/bin/bash
free=$(free -mt | grep Total | awk '{print $4}')
if [ $free -lt 256 ]; then
date
echo Warning, free memory is ${free} mb only. 
date
fi

因此,如果空闲RAM小于256 mb - 它在shell上提供以下输出

[root@server ~]# sh /tools/mem.sh
Fri Dec 19 11:19:44 CET 2014
Warning, free memory is 245 mb only.
Fri Dec 19 11:19:45 CET 2014

因此,如果空闲RAM超过256 mb - 它没有显示任何输出。

我设置cron每分钟运行

sh /tools/mem.sh | mail -s "Server Low Memory" email@me.com

问题是 - 我每分钟都有空输出的电子邮件,虽然我只需要如上所述输出存在的电子邮件 - 实际内存少于256 mb

我已经尝试了

sh /tools/mem.sh 2>&1 > /dev/null | mail -s "Server Low Memory" email@me.com
sh /tools/mem.sh > /dev/null | mail -s "Server Low Memory" email@me.com

但没有效果,同样通过电子邮件发送空输出和实际输出。

变式2 - 我甚至尝试过

sh /tools/mem.sh >/dev/null 2>/tools/mem.txt ; if [ -s /tools/mem.txt ] ; then mail -s "Server Low Memory" < /tools/mem.txt email@me.com ; fi

但它没有向/tools/mem.txt写任何内容 - 即使输出存在 - /tools/mem.txt的值为0(零)。

结果 - 它不发送任何电子邮件(即使有必要)

如果没有向/tools/mem.txt写任何内容,上面的输出有什么问题?

这可能是解决方案的另一种变体?

可能是bash脚本本身应该以另一种方式生成输出吗?

提前感谢提示和变体尝试!

2 个答案:

答案 0 :(得分:0)

主要是由于脚本/日志文件权限和脚本/日志文件的所有权而发生此问题。我面临同样的问题。我发现我的脚本所有者不是超级用户,例如根

因此,您必须将您的脚本的权限和所有权设置为超级用户。在下面找到。

首先以超级用户身份编辑crontab

[abc@host] crontab -e

并保存crontab:wq!

现在设置脚本

的权限
[abc@host] chmod +x script.sh
[abc@host] chown root:root script.sh

现在重新启动你的crontab。

[abc@host] /etc/init.d/crond restart

答案 1 :(得分:0)

| mail -s "Server Low Memory" email@me.com部分放入mem.sh中? - anishsane

或者,正如您在变体2中已经发现的那样,

sh /tools/mem.sh >/tools/mem.txt; if [ -s /tools/mem.txt ] ; then mail -s "Server Low Memory" < /tools/mem.txt email@me.com ; fi

。这应该工作。您的变体2代码已将o / p重定向到/dev/null。因此它总是空的。 - anishsane