cron 里跑脚本,环境变量和你想的不一样
脚本在终端里跑得好好的,放进 crontab 就报 command not found、或者 python 找不到包。
cron 的环境极简:PATH 通常只有 /usr/bin:/bin,SHELL 是 /bin/sh,不读 .bashrc、.profile,也没有 LANG。
三个办法,按推荐顺序:
一,脚本里写绝对路径,别依赖 PATH。
二,在 crontab 顶部显式声明:
PATH=/usr/local/bin:/usr/bin:/bin
SHELL=/bin/bash
LANG=en_US.UTF-8
三,实在需要复杂环境,用 bash -lc 'source /etc/profile; ...' 包一层。但 -l 会读登录脚本,可能带来别的副作用。
排查时最快的办法是在脚本第一行加 env > /tmp/cron-env.txt,跑一次,和交互式 shell 的 env 对比。