我使用 crontab 每分钟运行一个 python 脚本。我的 crontab 文件如下所示:
*/1 * * * * source /root/.bashrc && source /home/env/bin/activate && python /home/manage.py shell < /home/script.py >> /var/log/navjob.log 2>&1
当尝试使用此命令检查 syslog 中的 cron 输出时,#grep CRON /var/log/syslog
输出如下:
...CRON[764888]: (root) CMD (source /root/.bashrc && source /home/env/bin/activate && python /home/manage.py shell < /home/script.py >> /var/log/navjob.log 2>&1)
...CRON[764887]: (CRON) info (No MTA installed, discarding output)
但是日志文件(/var/log/navjob.log)是空的,并且代码没有运行!
答案1
当你链接命令并添加重定向时,例如
cmd1 && cmd2 && cmd3 >> somefile 2>&1
(或cmd1 ; cmd2 ; cmd3 >> somefile 2>&1
等等)重定向仅适用于链中的最后一个命令。要重定向所有命令,您需要将命令分组,例如
{ cmd1 && cmd2 && cmd3 ; } >> somefile 2>&1
或(使用子 shell)
( cmd1 && cmd2 && cmd3 ) >> somefile 2>&1
在这种情况下,你的 cron 任务很可能在第一个source
命令时就失败了,因为这source
是一个 bashism,而 cron 的默认 shell 是/bin/sh
- 要么SHELL=/bin/bash
在 crontab 条目前添加,要么更改source
为 POSIX.