Bash 如何从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

现在我有一个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** | 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而不是文件。