Python3脚本控制台运行正常但经crontab执行时出现输出与结果异常
crontab定时运行Python脚本任务量异常排查
核心问题定位方向
- crontab执行环境和交互式SSH环境完全隔离。你手动SSH执行脚本时加载的完整PATH、代理配置、用户鉴权信息、shell自定义配置,crontab默认一概不加载。最常见的后果就是脚本拉取远程任务列表时,因为没有网络配置、没有鉴权信息,拿不到全量任务,只能抓到1条无效/默认任务,最后进度条只会显示单任务执行完成。
- 现有输出重定向配置漏了错误流。你写的crontab规则只把标准输出写到日志文件,脚本运行时报的错、接口请求失败的提示全走标准错误流,根本没进日志,你自然看不到真实的运行问题。正确的日志配置要加上
2>&1,把错误流合并到标准输出里。 - 执行的工作目录不对。crontab默认的执行目录是配置crontab那个用户的家目录,脚本只要是靠相对路径读同目录下的配置、缓存文件,不切到脚本所在目录再执行的话,读不到配置自然就会任务加载不全。
- 执行用户身份不对。要核对配置crontab的用户,和你手动SSH跑脚本的用户是不是同一个。如果跨用户配crontab,脚本读本地缓存、鉴权文件的时候会因为权限不足,拿不到完整的待处理任务列表。
可直接用的修正配置
*/3 * * * * cd /var/www/secret_directory && /usr/bin/python3 main.py > /home/USER/grabber.log 2>&1
如果改完还是任务量不对,可以临时加个环境校验的逻辑:
*/3 * * * * cd /var/www/secret_directory && (whoami; env) > /home/USER/env_check.log 2>&1 && /usr/bin/python3 main.py >> /home/USER/grabber.log 2>&1
跑一次之后打开env_check.log,和你SSH终端下输whoami、env出来的输出对比,缺啥环境变量(比如代理地址、API密钥路径)就直接把变量定义写在crontab任务行的最前面就行。
特殊现象说明
tqdm进度条在非交互式终端下的输出格式和SSH手动跑的效果本来就不一样:不是TTY环境的时候,tqdm不会动态刷新同一行,会把所有进度输出拆成单独的行写进日志,这是正常现象,不代表脚本跑坏了。如果日志里的任务总量和你手动跑的时候对得上,只是进度条排版不一样,根本不需要额外调整。
内容的提问来源于stack exchange,提问作者RAD6000
相关产品推荐
相关产品推荐

