今天发现爬虫脚本的一个问题:“直接在shell下运行的话,爬SIPO网站的数据得到的是中文;但是在crontab中启动的脚本爬出来的数据却是英文。”想了好半天,怀疑是环境的问题,然后一查,果然有好多人提到。原来crontab的环境变量跟用户的环境变量是不一致的!!!
直接在用户shell下敲env命令,可以看到有一行LANG=zh_CN.UTF-8,而crontab默认的环境语言是英文的,所以可以在编辑crontab时加上语言这一行。如下:
2022.04.21
最近在 Oracle 云上搞了两台服务器,并且安装了 certbot 来自动更新证书,但每次 crontab 执行 /usr/bin/certbot renew --quiet
时都会报错。错误日志如下:
certbot.errors.NoInstallationError: Could not find a usable ‘nginx’ binary. Ensure nginx exists, the binary is executable, and your PATH is set correctly.
说是找不到 nginx。但如果手工运行是可以正常更新证书的。
所以猜测估计也是跟 crontab 的环境变量有关。
在 crontab 中添加一行打印出 PATH 变量:
*/5 * * * * echo $PATH > /root/cron_touch.txt
得到的结果是:
/usr/bin:/bin
直接使用 echo $PATH
打印出 root 用户的 PATH 变量,结果如下:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
使用 which nginx
检查 nginx 所在路径,发现是在 /usr/sbin/nginx
中。
所以解决方案是在 crontab 的头部添加如下一行,以修改 crontab 的 PATH 变量。
PATH=/usr/sbin:/usr/bin:/bin
所以cronjob里面python之类的命令一般都用全部路径写