Laravel 9 Cron任务未执行:数据库无变更问题求助
Laravel 9 Cron任务不执行排查方案
一、先确认系统Cron核心配置
这是最容易遗漏的步骤:必须在服务器的Cron中添加Laravel调度器的触发命令,否则schedule:list能看到任务,但实际不会被触发。
- 执行
crontab -e编辑当前用户的Cron规则 - 添加以下内容(替换为你的项目绝对路径):
注意:如果服务器存在多个PHP版本,要写PHP的完整路径(比如* * * * * cd /var/www/your-laravel-project && php artisan schedule:run >> /dev/null 2>&1/usr/bin/php8.1),避免环境变量不匹配;同时Cron执行用户要和项目权限用户一致,否则会出现数据库访问、文件写入权限问题。
二、排查任务执行的环境差异
命令行手动执行和Cron执行的环境可能不一致:
- 在
Kernel.php的任务逻辑中添加日志输出,验证任务是否真的被触发:
然后查看use Illuminate\Support\Facades\Log; protected function schedule(Schedule $schedule) { $schedule->call(function () { Log::info('Notification更新任务触发', ['user' => get_current_user(), 'env' => env('APP_ENV')]); // 你的更新逻辑 DB::table('notifications')->update(['read_at' => now()]); })->everyMinute(); }storage/logs/laravel.log,如果没有这条日志,说明Cron根本没触发调度器;如果有日志但数据库没变化,再排查逻辑或数据库权限。
三、查看错误日志
Cron系统日志
- Ubuntu/Debian:查看
/var/log/syslog,用grep CRON /var/log/syslog过滤Cron相关记录,能看到任务是否执行、是否有路径错误或权限报错。 - CentOS/RHEL:直接查看
/var/log/cron文件,里面记录了所有Cron任务的执行情况。
Laravel应用日志
默认路径是storage/logs/laravel.log,任务执行中的数据库错误、逻辑报错都会在这里输出详细信息,比如数据库连接失败、字段不存在等问题。
四、其他验证步骤
- 手动执行
php artisan schedule:run,看终端是否有任务执行的输出,验证任务本身逻辑是否正常。 - 检查项目权限:确保
storage/和bootstrap/cache/目录有写入权限,避免日志无法记录或配置缓存异常。 - 确认
Kernel.php中的任务调度方法正确,比如是否用了->everyMinute(),闭包或命令是否无误。
内容的提问来源于stack exchange,提问作者user761100
相关产品推荐
相关产品推荐

