![如果正文不为空,则从命令行发送邮件](https://linux22.com/image/572739/%E5%A6%82%E6%9E%9C%E6%AD%A3%E6%96%87%E4%B8%8D%E4%B8%BA%E7%A9%BA%EF%BC%8C%E5%88%99%E4%BB%8E%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%91%E9%80%81%E9%82%AE%E4%BB%B6.png)
我想编写一个简单的脚本,当日志发生变化时提醒我。为此,我使用 grep 来查找我感兴趣的行。现在它的工作原理如下:
grep line /var/log/file | mail -s Log [email protected]
问题是,即使没有找到匹配的行,它也会发送邮件。GNU Mailutils 的邮件实用程序似乎没有开关告诉它丢弃带有空正文的邮件。
有没有快速又简单的方法可以做到这一点?
答案1
output=$(grep line /var/log/file); [[ -n "$output" ]] && mail -s Log [email protected]
或者您可以将其变成一个 cron 作业,然后如果它产生任何输出,它将向用户发送电子邮件。您可以编辑 /etc/aliases 文件(然后运行 newaliases 命令)以将邮件发送到不在框上的地址。
例如 cron 条目(虽然你不能设置主题行
1 0 * * * grep line /var/log/file
或者你可以得到 ifne 实用程序 - 这可能就是你想要的
grep line /var/log/file | ifne mail -s 日志[电子邮件保护]
ifne 命令可从适用于 centos 和 RHEL 的 epel repo 获得。我在网上找不到手册页的链接,但它就在那里
如果 ne(1)
如果 ne(1)NAME ifne - 如果标准输入不为空则运行命令
摘要 ifne [-n] 命令
描述 ifne 当且仅当标准输入不为空时才运行以下命令。
选项 -n 逆操作。如果标准输入为空,则运行该命令。
Note that if the standard input is not empty, it is passed through ifne in this case.
示例 find . -name core | ifne mail -s "找到核心文件" root
作者版权所有 2008 Javier Merino
Licensed under the GNU GPL 2008-05-01 ifne(1)
答案2
“man mail”告诉我,如果正文为空,参数-E 将停止发送邮件。对我来说很好用。
-E
如果传出消息的第一部分或唯一部分不包含任何文本,则不发送该消息,而是默默丢弃它,从而在程序启动时有效地设置 skipemptybody 变量。这对于从 cron(8) 启动的脚本发送消息非常有用。
答案3
看https://unix.stackexchange.com/a/100720/27458
只需使用伊夫尼:
grep line /var/log/file | ifne mail -s Log [email protected]