stderr
如果输出( )包含某个字符串,我可以让 cron 仅发送电子邮件吗?
我知道这个答案,但我运行的命令不区分stdout
/ stderr
,它总是只输出到stdout
,所以我需要寻找一个字符串。
到目前为止,我得到了这个,它基本上可以工作,除了 grep 不会将输出传递给 mail 命令,所以我只收到一封空电子邮件:
0 5 * * * root mycommand | grep -q 'Renewal was done' && mail -s 'Renewal completed' [email protected]
如何从电子邮件中包含的 mycommand获取整个输出?
我强烈建议您将逻辑放入脚本中并在 cron 中运行该脚本,而不是尝试在 cron 中制作一个单行脚本。这样您就可以轻松地在 cron 之外对其进行测试,例如:
您可以添加对 mycommand 退出状态的检查、传递正在运行的命令、匹配的字符串以及作为参数的电子邮件地址等。
这可能会奏效。
这是我的做法:
在这种情况下,我需要备份 4 个数据库(转储),如果一切正常,我希望收到一封提及此事的电子邮件。如果我有错误,我想要一条带有不同主题的消息来指出它,消息正文中包含失败的数据库以及附加到电子邮件的错误日志。
第一个文件(/root/templates/ylatis-backup.txt)只是一个消息正文模板:
所有以 % 为前缀的单词都被视为变量,稍后在脚本中被 sed 替换。
%hostname 和 %net_config 用于识别电子邮件来自哪台计算机。
以 _status 结尾的变量被替换为 NORMAL 或 ERROR,这样我就可以知道出了什么问题。
请注意我如何监视 rsync 的退出状态以确定我的电子邮件的消息和主题应该是什么。在我的情况下,我丢弃了正常输出(1>/dev/null)并只保留标准错误输出(2>$error_log)。如果要保留所有输出,可以只使用 >> 运算符。如果您正在从终端阅读邮件,您还可以调整以在消息中包含日志而不是附件,以方便使用。
也许对于一个相对简单的问题来说,这看起来有点矫枉过正,但我认为它很好地概述了你正在尝试做的事情。您需要在通过中间脚本运行命令时构建消息并稍后发送。如果您发现上面的代码有用并且有任何问题,请随时在评论中提问。