注意!crontab的环境变量并非用户环境变量

注意!crontab的环境变量并非用户环境变量

今天发现爬虫脚本的一个问题:“直接在shell下运行的话,爬SIPO网站的数据得到的是中文;但是在crontab中启动的脚本爬出来的数据却是英文。”想了好半天,怀疑是环境的问题,然后一查,果然有好多人提到。原来crontab的环境变量跟用户的环境变量是不一致的!!!

直接在用户shell下敲env命令,可以看到有一行LANG=zh_CN.UTF-8,而crontab默认的环境语言是英文的,所以可以在编辑crontab时加上语言这一行。如下:

屏幕快照 2017-03-22 01.56.26

 


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

 

 

One thought on “注意!crontab的环境变量并非用户环境变量

Leave a Reply

Your email address will not be published. Required fields are marked *