laravel项目使用sudo命令重启队列导致缓存目录所有者意外变root?

1、收到异常报错

在运行的laravel站点报缓存文件不存在,这个问题遇到很多次了, 照例打开目录 一看,ee目录包括下面文件夹所有者为root,权限755,fpm运行用户为www,肯定没权限, 修改为www,cache目录所有者一直都是www,这个root很扎眼

file_put_contents(/www/wwwroot/****.com/releases/5/storage/framework/cache/data/ee/25/ee2526425ad0ed8336ff7c3e201a525014a3b2d6): failed to open stream: No such file or directory

2 问题分析

  • 没有用root执行定时任务,一直都是crontab -u www -e
  • 没有通过ssh执行php artisan命令,(虽然我一直都用root,但这次不是)
  • 通过搜索得知这个缓存是队列在用的,问题出在队列上,队列使用supervisor守护,supervisor是root用户运行, 但是 artisan命令是www在跑的
  • 同问题出现在多个通过deployer部署的站点上,而且发生在每次更新之后,因为每次更新都会执行 cache:clearqueue:restart, 我的代码
    if(get('need_restart_queue')) {
          run('sudo {{bin/php}} {{release_path}}/artisan cache:clear');
          run('sudo {{bin/php}} {{release_path}}/artisan config:clear');
          run('sudo {{bin/php}} {{release_path}}/artisan queue:restart');
      } else {
          writeln('<info>不需要重启队列</info>');
      }

    3 发现问题

    问题就是出现在run('sudo {{bin/php}} {{release_path}}/artisan queue:restart');这个行上面,使用sudo,缓存目录生成的文件所有者就是root,不使用所有者为deployer, 诡异的事是,deployer脚本使用deployer用户专用的sshkey登录执行各种命令,不应该导致这个问题,通过测试, 使用deployer用户在命令行执行,sudo php artisan queue:restart 也会导致缓存 ee目录所有者变为root,ee目录需要删除让框架重新生成。

    4 问题简化

    普通用户使用 sudo 执行 artisan 命令导致生成的缓存文件所有者变为 root ,请问有碰到这个问题的朋友么,怎么避免这个,现在临时解决方案是不使用sudo,但是问题出在哪,还不清楚,迫切需要找到根?

    5 附录

  • 服务器环境 ubuntu 16.04
  • 代码框架 laravel5.8
当你的才华撑不起你的野心的时候,你就必须静下心来学习
xin6841414
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

sudo -u www 还会有这种问题码?

3年前 评论
xin6841414 (楼主) 3年前
讨论数量: 4
leo

sudo whoami 看看输出就知道为什么了

3年前 评论
xin6841414 (楼主) 3年前

sudo -u www 还会有这种问题码?

3年前 评论
xin6841414 (楼主) 3年前
xin6841414

找到依据,Linux sudo 命令以系统管理者的身份执行指令,也就是说,经由 sudo 所执行的指令就好像是 root 亲自执行,以后非必要还是少用sudo吧 :joy:

3年前 评论

@xin6841414 但是你也可以指定执行的用户啊,不要因噎废食啊!

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!