现在我有一个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文件名,则不邮寄
答案 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 || othercommand
是if ! command; then othercommand; fi
的简单简短缩写(或者,如果你对shell脚本不是很擅长,那么等效的反模式command; if [ $? -ne 0 ]; then othercommand; fi
)。< / p>