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

栏目: IT技术 · 发布时间: 4年前

内容简介:睡觉之前,记录昨天遇到的一个问题,不然时间一长我就忘记了,如果我从工作开始就写博客,那么很多美好的事情都不会忘记了,自己的技术水平肯定也会提升一大截。昨天上班后,同事说有一些问题,由于相关程序是队列运行的,先查看了一下php cli错误日志,发现很多脚本提示 Call to undefined function,当时觉得挺奇怪的,因为其他web机器没有该问题。然后手动运行了一个脚本,没有任何问题,基本上断定是cron运行导致的,就先模拟写了个小程序:

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

昨天上班后,同事说有一些问题,由于相关程序是队列运行的,先查看了一下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环境。

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


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

埃隆·马斯克传

埃隆·马斯克传

陆西 / 重庆出版社 / 2014-7 / 38.00元

埃隆·马斯克(Elon Musk)1971年出生于南非,毕业于美国宾夕法尼亚大学,工程师、企业家、亿万富翁。最成功的全球网上支付平台Paypal创始人之一,现任美国商业航天企业空间探索技术公司(SpaceX)CEO,电动车生产企业特斯拉汽车(Tesla Motors)CEO,光伏发电服务供应企业SolarCity董事长。如今他被视为经济危机后美国创新与科技实力的新象征。 今天PayPal依然......一起来看看 《埃隆·马斯克传》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

MD5 加密
MD5 加密

MD5 加密工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具