Ubuntu 从cron向文件和电子邮件输出stderr

Ubuntu 从cron向文件和电子邮件输出stderr,ubuntu,cron,output,sh,stderr,Ubuntu,Cron,Output,Sh,Stderr,我有Ubuntu服务器,我有一个运行python脚本的cron作业。 我知道在crontab中添加MAILTO=可以获得stderr输出。我还知道,将stdout和stderr输出到文件的标准方法是使用2>&1重定向。我的第一个问题来了 无论我使用了什么,我都得到了错误/bin/sh:1:语法错误:错误的fd编号。几个小时后,我意识到这取决于sh版本。我可以将所有内容输出到文件的唯一方法是使用以下命令00***/usr/bin/python3/data/script.py>&/data/logs

我有Ubuntu服务器,我有一个运行python脚本的cron作业。 我知道在crontab中添加
MAILTO=
可以获得stderr输出。我还知道,将stdout和stderr输出到文件的标准方法是使用
2>&1
重定向。我的第一个问题来了

无论我使用了什么,我都得到了错误
/bin/sh:1:语法错误:错误的fd编号
。几个小时后,我意识到这取决于sh版本。我可以将所有内容输出到文件的唯一方法是使用以下命令
00***/usr/bin/python3/data/script.py>&/data/logs/date+\%d\%m\%Y\%out.log
。我在网上发现它属于
csh
tcsh
。我不明白,因为我在我的系统上使用了bash。为什么像
>/log.txt 2>&1这样的标准重定向对我不起作用

我的第二个问题是,我希望继续将stdout和stderr写入一个文件,并希望继续通过
MAILTO
向stderr发送电子邮件。我试图玩
tee
命令,但没有成功。
非常感谢您的帮助

您可以在crontab文件的开头添加变量,以确保使用正确的shell。对于第二个问题,您可以使用“tee”命令,该命令将所有内容从STDIN发送到STDOUT,并将其保存到文件:

# crontab file example
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=your@email.com
0 * * * * /usr/bin/python3 /data/script.py 2>&1 | tee /var/log/log.txt

谢谢你的回复。添加变量会有所帮助,但是您的解决方案会将所有内容输出到文件和邮件中。我想把所有的东西都放在一个文件里,只想在电子邮件里记录。我不知道这是否可能