定时任务不切换用户执行的后果

事故背景

thinkphp6.x 项目运行时,偶尔出现异步队列执行失败的情况,实际调试时发现一切正常,但是异步队列就是会经常出现失败超时
调试来调试去,就是没有问题,怀疑执行的进程太多,抢占了任务??【为了加快速度,开了五个进程】,后面调试减少到一个进程,好像好了很多【心理安慰+999】
就这样相安无事了好几天,这个问题又出现!!!
再因为这个任务是支付确认的异步队列,要是订单没有办法确认的话,真的会凉凉的
排查过程中发现出现这个问题时候,手动断点调试是没有问题的,自动执行的话会提示订单查询失败。实际订单是肯定存在的
怀疑是更新出现缓存,删除缓存后重启队列,又正常运行了。但是更新是不可能出现什么缓存的,都是业务代码。后面想查询一下日志执行了什么SQL
发现一个root权限创建的日志文件,顿悟了。项目运行的权限是属于 www 的以 root 权限创建了日志之后,使用www权限运行的任务全部无法写入日志,埋下了一个巨坑。好像之前有处理过,又没有记录.......

注意事项

计划任务添加时必须指定执行用户,否则默认执行用户为root
比如使用thinkphp框架,不指定用户执行了一个定时任务,【不指定就是root】 不注意的话可能导致项目权限为www的用户无法写入日志,出现一些诡异的BUG

错误姿势

php /www/wwwroot/xiadmin/think doTest

正确姿势

在执行命令前切换用户 su www -s

su www -s /www/server/php/74/bin/php /www/wwwroot/xiadmin/think doTest

给TA支持
共{{data.count}}人
人已支持
phpthinkphp

thinkphp-queue队列详细说明

2022-5-2 17:25:03

知道工作日志随笔

Docker安裝rabbitMq

2022-8-19 16:37:43

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
今日签到
有新私信 私信列表
搜索