我有最简单的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脚本本身应该以另一种方式生成输出吗?
提前感谢提示和变体尝试!
答案 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