必须用> file 2>&1或>> file 2>&1,禁用2> file > file——后者因两次打开文件导致stdout被覆盖丢失,且cron默认/bin/sh不支持&>等bash简写。

直接在 crontab -e 里改重定向语法就行,但必须用 2>&1 或 &>,不能写成 2> file > file —— 后者会丢日志、覆盖错乱、甚至任务静默失败。
crontab 里错误输出重定向写法不对就白配
很多人加了 2> /var/log/myscript.err 却发现文件始终为空,或只有部分错误。根本原因是 cron 环境下 shell 默认是 /bin/sh(不是 bash),不支持某些简写语法,且重定向顺序敏感。
-
* * * * * /usr/bin/python3 /opt/script.py 2> /var/log/script.err—— 只捕获错误,但 stdout 仍打屏(cron 会邮件发给你,可能被忽略) -
* * * * * /usr/bin/python3 /opt/script.py > /var/log/script.out 2>&1—— 正确:先重定向 stdout 到文件,再把 stderr 指向同一目标 -
* * * * * /usr/bin/python3 /opt/script.py &> /var/log/script.log—— 在 cron 的/bin/sh下不兼容,CentOS 7 默认会报 syntax error
为什么 2> file > file 是危险写法
这个写法看似“都往一个文件写”,实际执行时 shell 会先打开 file 写 stdout(清空原内容),再打开 file 写 stderr(再次清空)。最终只保留 stderr 的最后几行,stdout 全丢。
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离
- 错误示范:
/opt/script.sh > /tmp/log 2> /tmp/log - 正确等价写法只有两种:
> /tmp/log 2>&1或1> /tmp/log 2>&1 - 想追加?用
>>:> /tmp/log 2>&1是覆盖,>> /tmp/log 2>&1是追加(注意:必须两个都追加,不能混用>>和>)
权限和路径问题比语法更容易卡住
即使语法全对,cron 任务仍可能静默失败——因为目标路径不存在、目录无写权限、或用户没权限写到那个位置。
- cron 以当前用户身份运行,但
/var/log/下多数子目录只允许 root 写,普通用户得改路径,比如/home/user/logs/ - 确保目录存在:
mkdir -p /home/user/logs,并设对权限:chown user:user /home/user/logs - 测试命令是否真能写入:
sudo -u user sh -c 'echo test > /home/user/logs/test.log 2>&1' - 别依赖相对路径:
./script.sh在 cron 里大概率找不到,一律写绝对路径/home/user/script.sh
真正容易被忽略的点是:cron 不读你的 ~/.bashrc,所以 PATH 很窄(通常只有 /usr/bin:/bin),Python 脚本如果用了 virtualenv 或非标路径的二进制,得显式写全路径,否则 command not found 错误连 stderr 都不会触发——因为根本没执行到那步。

















