Laravel定时任务写入日志用户变为root导致Web进程无法写入日志问题

2020年10月20日 · 59 字 · 1 分钟

今天访问接口时返回 接口写入日志失败,通过排查后发现 storage/logs下面出现了root用户新建的日志,导致www用户无法写入日志。

通过排查发现,crontab写入了laravel定时任务命令。默认情况下,crontab的任务是使用root用户去执行的,因此laravel定时任务新建的文件属主自然成为了root

解决方法

解决方法就是使用指定用户来运行 crontab 任务。比如使用www用户来运行laravel的计划任务命令。

使用下面的命令编辑www用户的定时任务。

crontab -u www -e

例如写入下面的示例任务:

* * * * * /usr/local/php/bin/php /data/wwwroot/laravel/artisan schedule:run >> /var/log/laravel-crontab.log 2>&1

保存即可,等待系统运行任务。

运行时错误

通过观察发现定时任务并没有成功运行,通过查询/var/log/cron日志发现如下的日志:

(www) CMD (/usr/local/php/bin/php /data/wwwroot/laravel/artisan schedule:run >> /var/log/laravel-crontab.log 2>&1)
(CRON) ERROR chdir failed (/home/www): No such file or directory

可以看到,定时任务确实有执行,但是执行出错。出现这个问题的原因是www 用户没有主目录

解决方案如下:

  1. 新建/home/www目录
  2. /home/www的用户属主改为www用户

相关命令如下:

mkdir /home/www
chown -R www:www /home/www

后续执行没有再出现错误。