18

crontab 运行环境遇到的一个问题

 4 years ago
source link: https://mp.weixin.qq.com/s/2GtGbUvATw4dNu5Ps5xp8w
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

睡觉之前,记录昨天遇到的一个问题,不然时间一长我就忘记了,如果我从工作开始就写博客,那么很多美好的事情都不会忘记了,自己的技术水平肯定也会提升一大截。

昨天上班后,同事说有一些问题,由于相关程序是队列运行的,先查看了一下php cli错误日志,发现很多脚本提示 Call to undefined function,当时觉得挺奇怪的,因为其他web机器没有该问题。

然后手动运行了一个脚本,没有任何问题,基本上断定是cron运行导致的,就先模拟写了个小程序:

include "init.php";
echo "start";
echo self_function();//定义在init.php中
echo "end";

然后设置cron:

*/1 * * * * www php /usr/local/www/index.php >> /usr/local/www/debug.log

还是同样的问题,因为是找不到函数,将 include 改为 require 也还是同样的报错,而不是说找不到文件,这就很诡异了;然后把 cli 命令行模式的 Opcache 关闭了,同样报错;

因为以前cron运行Python遇到过编码的问题,所以一个闪念,修改了cron:

*/1 * * * * www cd /usr/local/www; php index.php

运行没有问题,虽然问题解决了,但这样cron部署就没有通用性了,所以感觉还是不好。

不断试验,将 init.php 改为 init2.php,然后cron运行就没问题,是不是文件缓存?不管是删除init.php重建;或者stat修改属性;或者将init.php引用目录改为/usr/local/init.php,还是不行,只要名字为 init.php 就是不行。

查看 /var/log/cron 也没有问题。甚至重启 systemctl restart crond.service 也还是不行。

后来同事发了一个php cli 错误报错,虽然看过错误日志但没有注意,猛的发现提示 /home/www/init.php 中没有 HTTP_HOST,怎么提示在 /home/www 目录下?

立刻去/home/www/一看,还真有init.php,删除后,cron正确运行。

基本上验证了 cron 会以 $HOME /home/www 环境变量运行,相当于 index.php 引用 /home/www/init.php,而不是相对路径引用 /usr/local/www/init.php。

后面代码引用文件还是绝对路径较好,那这个 /home/www/init.php 怎么来的呢?这反应了线上环境不能轻易登陆,明年去申请一台配置较低的ecs,作为开发环境和QA环境。

最后还是说一句,其实意识到环境变量的问题,但还是排查了很久,一方面是基本功问题,一方面也是判断力的问题。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK