如何在不写入文件的情况下从CRON Job发送电子邮件?

时间:2014-03-06 17:04:01

标签: bash cron crontab

现在我有一个CRON工作,如下所示,

1 * * * * python filename.py | if [[ $? -ne 0 ]]; then email 'subject' mail@mail.com -c mail1@mail.com ; fi

但它只将主题发送到我的邮箱。但我希望filename.py中的错误消息,即正文消息应该包含文件的错误。 一种方法是

1 * * * * python filename.py  **>> backup_log 2>&1** | if [[ $? -ne 0 ]]; then email 'subject' mail@mail.com -c mail1@mail.com < **backup_log**; fi

但是我不想写日志文件...如何发送错误消息或最好的方法来处理日志文件???

为什么[[$? -ne 0]]条件无法正常工作。如果我提供错误的python文件名,则不邮寄

3 个答案:

答案 0 :(得分:1)

使用mailx发送邮件:

python filename.py | mailx -s "Subject" "mail@mail.com"

答案 1 :(得分:0)

你可以创建一个FIFO:

mkfifo /tmp/mailbody

然后修改你的crontab:

1 * * * * python filename.py  >> 2>&1 /tmp/mailbody | if [[ $? -ne 0 ]]; then email 'subject' mail@mail.com -c mail1@mail.com < /tmp/mailbody; fi

答案 2 :(得分:0)

错误消息没有出现的原因是错误消息被发送到标准错误(文件描述符2),而管道只包含标准输出(文件描述符1)。

然而,你根本不需要这个; cron的默认行为是通过电子邮件发送所有作业的任何输出。如果目前没有发生这种情况,请检查您是否在MAILTO文件中正确设置了crontab

MAILTO=you@example.com
1 * * * * python filename.py

切向地,您不能在管道中使用$?,因为在评估管道时,管道中上一个命令的退出状态尚不可用。

如果您想要详细控制何时发送电子邮件,这不是很复杂,但在单个crontab行中确实有点多。

1 * * * * output=$(python filename.py 2>&1) || echo "$output" | mail -s subject you@example.com

符号command || othercommandif ! command; then othercommand; fi的简单简短缩写(或者,如果你对shell脚本不是很擅长,那么等效的反模式command; if [ $? -ne 0 ]; then othercommand; fi)。< / p>