如果正文不为空,则从命令行发送邮件


12

我想编写一个简单的脚本,如果日志发生更改,它会提醒我。为此,我使用grep查找我感兴趣的行。现在,它的工作方式如下:

grep line /var/log/file | mail -s Log email@domain.tld

问题是,即使找不到匹配的行,它也会发送一封邮件。mailutils中的mail实用程序似乎没有任何开关告诉它丢弃具有空正文的邮件。

有没有快速简便的方法?

Answers:


12
output=$(grep line /var/log/file); [[ -n "$output" ]] && mail -s Log email@domain.tld

或者,您可以将其设置为Cron作业,然后如果产生任何输出,它将通过电子邮件发送给用户。您可以编辑/ etc / aliases文件(然后运行newaliases命令)以将邮件发送到不在框中的地址。

cron输入项前的内容(您将无法设置主题行

1 0 * * *  grep line /var/log/file

或者,您可以获取ifne实用程序-这可能就是您想要的

grep行/ var / log / file | ifne邮件-s日志email@domain.tld

ifne命令可从epel库中获取centos和RHEL。我在网上找不到指向手册页的链接,但是有

ifne(1)
ifne(1)

NAME ifne-如果标准输入不为空,则运行命令

概要ifne [-n]命令

描述仅当标准输入不为空时,ifne才运行以下命令。

选项-n反向操作。如果标准输入为空,请运行命令。

          Note  that  if  the  standard  input  is not empty, it is passed
          through ifne in this case.

查找示例。名称核心| ifne邮件-s“找到核心文件”根目录

作者Copyright 2008 by Javier Merino

   Licensed under the GNU GPL

                              2008-05-01                           ifne(1)

2
请注意,如果grep不生成任何输出,它将退出非0值,因此您可以这样做:output = $(grep line / var / log / file)&& echo“ $ output” | mail -s Log user@example.com
Sean Reifschneider 2012年

另外,建议的命令不会将“ $ output”发送到mail命令。:-)
肖恩·赖夫施耐德

我建议编辑答案以包含@Sean Reifschneider建议的解决方案
Basil A

仅供参考,ifne可以moreutils在ubuntu 的软件包中找到。不幸的是,该软件包还带来了parallel与软件包parallel命令冲突的问题parallel
artfulrobot

14

“ man mail”告诉我,如果body为空,则-E参数将停止发送邮件。对我来说很好。

-E

如果外发消息的第一个或唯一消息部分不包含任何文本,请不要发送而是静默丢弃它,从而在程序启动时有效地设置了skipemptybody变量。这对于从cron(8)启动的脚本发送消息很有用。


3
在Ubuntu 12.04上,已安装GNU Mailtools 2.1,并且“邮件”的“ -E”选项是--exec的简写。它不包含“空主体”选项。
Mark Stosberg

3
@MarkStosberg:Ubuntu有多个替代软件包,它们提供了mailor mailx命令。在bsd-mailxheirloom-mailx一个包都提供mailx-E选项描述。
Smylers,2015年

1
在CentOS 6.5上为我工作:grep "find me" /var/log/something | mail -s "That text you were looking for is now in the logs" -E mail@example.com
user2208096

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.