Bash 如何从CRON作业发送电子邮件而不写入文件?
现在我有一个CRON作业,如下所示Bash 如何从CRON作业发送电子邮件而不写入文件?,bash,cron,crontab,Bash,Cron,Crontab,现在我有一个CRON作业,如下所示 1 * * * * python filename.py | if [[ $? -ne 0 ]]; then email 'subject' mail@mail.com -c mail1@mail.com ; fi 但它只发送主题到我的邮件。但是我希望filename.py中的错误消息,即body消息应该包含文件的错误。 一种方法是 1 * * * * python filename.py **>> backup_log 2>&1
1 * * * * python filename.py | if [[ $? -ne 0 ]]; then email 'subject' mail@mail.com -c mail1@mail.com ; fi
但它只发送主题到我的邮件。但是我希望filename.py中的错误消息,即body消息应该包含文件的错误。
一种方法是
1 * * * * python filename.py **>> backup_log 2>&1** | if [[ $? -ne 0 ]]; then email 'subject' mail@mail.com -c mail1@mail.com < **backup_log**; fi
1****python filename.py**>>备份日志2>&1**;如果[$?-ne 0]];然后发送电子邮件“主题”mail@mail.com-cmail1@mail.com<**备份日志**;fi
但我不想写日志文件…如何发送错误消息或最好的方式来处理日志文件
为什么如果[$?-ne 0]]条件不起作用。即,如果我给出错误的python文件名,则不发送邮件
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
1****python filename.py>>2>&1/tmp/mailbody | if[$?-ne 0];然后发送电子邮件“主题”mail@mail.com-cmail1@mail.com
使用mailx发送邮件:
python filename.py | mailx -s "Subject" "mail@mail.com"
错误消息未发出的原因是错误消息被发送到标准错误(文件描述符2),而管道仅包含标准输出(文件描述符1) 然而,实际上你根本不需要这个;
cron
的默认行为是通过电子邮件发送所有作业的任何输出。如果此时未发生这种情况,请检查您在crontab
文件中是否正确设置了MAILTO
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!指挥部;然后是其他命令;fi
(或者,如果您对shell脚本不太在行,则使用等效的反模式命令;如果[$?-ne 0];然后使用其他命令;fi
)。我刚刚从您原来的帖子中复制了条件。。我唯一改变的是重定向到FIFO而不是文件。