Laravel crontab 配置问题

参考

Lnmp环境运行时一般会指定用户www运行。因此配置定时任务的时候,也需要使用www用户来运行定时任务,否则会造成laravel生成的日志是其它用户,导致laravel运行报错,没有日志的可写权限。

配置方法

1.获取当前系统PHP的环境变量

执行 env > /tmp/env.output 然后 cat /tmp/env.output

找到PATH

PATH=/usr/local/mysql/bin:/usr/local/php/bin:/usr/local/nginx/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

2.设置定时任务 -u 参数指定用户 命令参考 给www用户的crontab 添加环境变量PATH

crontab -u www -e

将PATH添加到crontab的第一行,

换行后将laravel的定时任务代码加上,截图中第二行, 制定了环境变量后,可以只写php 不用写php的完整路径 /usr/local/php/bin/php

3,不能遗漏的关键一步

在home目录下创建对应用户的文件目录,www 并修改用户权限为www 最后重启定时任务

cd home && mkdir www && chown -R www.www www
service crond restart

如果没有该用户的目录,crontab日志会有报错

(CRON) ERROR chdir failed (/home/www): No such file or directory

知识总结

Crontab详细介绍可以头部的参考链接,和《鸟哥linux私房菜-基础学习篇》第16章

任务调度分为两类: 系统任务调度 和 用户任务调度 

系统任务配置/etc/crontab

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

前四行是用来配置crond任务运行的环境变量,

  • 第一行SHELL变量指定了系统要使用哪个shell,这里是bash,
  • 第二行PATH变量指定了系统执行命令的路径,
  • 第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户,
  • 第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。
  • 第五行 前五个星号代表时间, user-name代表执行的用户,command代表执行的命令

crontab – u xxx -e 是用来设置用户系统任务调度的

所有用户定义的crontab文件都被保存在/var/spool/cron目录中。其文件名与用户名一致,使用者权限文件如下

/etc/cron.deny     该文件中所列用户不允许使用crontab命令
/etc/cron.allow    该文件中所列用户允许使用crontab命令
/var/spool/cron/   所有用户crontab文件存放的目录,以用户名命名

注意单独用户的crontab配置需要设置 PATH 并创建对应用户目录

service crond start    # 启动服务
service crond stop     # 关闭服务
service crond restart  # 重启服务
service crond reload   # 重新载入配置
service crond status   # 查看状态