Laravel Scheduler Not Running? Fix It Fast (Step-by-Step Guide for 2026)
๐ Introduction
If your Laravel scheduler is not running, scheduled tasks like emails, backups, or reports won’t execute — and this can break your application silently.
This is one of the most common Laravel production issues.
๐ The root cause is usually:
-
Missing cron job
-
Queue not running
-
Server misconfiguration
In this guide, you’ll learn exactly how Laravel scheduler works, why it fails, and how to fix it in local, VPS, and shared hosting environments.
โฐ What is Laravel Scheduler?
Laravel Scheduler allows you to define automated tasks in one place instead of managing multiple cron jobs.
Example:
protected function schedule(Schedule $schedule)
{
$schedule->command('emails:send')->daily();
}
๐ This runs your command automatically every day.
โ๏ธ How Laravel Scheduler Works (Simple Explanation)
Laravel scheduler depends on cron.
Required cron job:
* * * * * php /path-to-project/artisan schedule:run >> /dev/null 2>&1
๐ This runs every minute and triggers Laravel’s scheduler.
โฑ๏ธ What Does “Cron Runs Every Minute” Mean?
Cron expression:
* * * * *
๐ Means:
๐ Run command every minute
๐ What Happens Internally?
Every minute:
-
Cron runs
schedule:run -
Laravel checks scheduled tasks
-
Executes due tasks
๐ Example Timeline
| Time | Action |
|---|---|
| 10:00 | Cron triggers scheduler |
| 10:01 | Runs again |
| 10:02 | Runs again |
โ ๏ธ Important Behavior
-
Cron does not wait for previous execution
-
It blindly runs every minute
โ If No Tasks Exist
-
Scheduler runs
-
Nothing happens
-
Exits instantly
โ If Tasks Exist
-
Executes tasks
-
May push jobs to queue
๐ง Core Concepts (Must Understand)
๐ฆ Job (Task)
A job is a task like:
-
Send email
-
Process data
-
Generate report
๐ Queue (Task List)
Queue stores jobs before execution.
๐ Think: to-do list
๐ท Worker (Executor)
Worker processes jobs:
php artisan queue:work
Worker flow:
Check queue
→ Pick job
→ Execute job
→ Repeat forever
๐ง Simple Analogy
| Concept | Real Life |
|---|---|
| Job | Task |
| Queue | To-do list |
| Worker | Employee |
โ ๏ธ Important Production Rule
๐ In production, queue requires:
php artisan queue:work
โ Never run this inside scheduler
๐ Because:
-
It’s a long-running process
-
Scheduler expects short tasks
โ ๏ธ Laravel 11 & Laravel 12 Update
Starting from Laravel 11 and Laravel 12:
๐ Kernel.php is removed
๐ New Structure
Instead of:
app/Console/Kernel.php
Laravel now uses:
bootstrap/app.php
Example:
->withMiddleware(function (Middleware $middleware) {
$middleware->append(\App\Http\Middleware\YourMiddleware::class);
})
๐ Scheduler still exists, but internal structure changed.
๐ Environment Setup (Local vs Production)
๐งช Local Development
php artisan schedule:run
php artisan queue:work
โ Manual testing
๐ VPS / Dedicated Server
-
Cron → Scheduler
-
Supervisor → Queue worker
โ Best performance
โ Recommended setup
๐ Shared Hosting (Important)
Limitations:
-
No persistent processes
-
No Supervisor
โ๏ธ Queue Handling in Shared Hosting
๐ Use cron as worker replacement
โ Cron Worker Setup
* * * * * php /home/username/public_html/artisan queue:work --stop-when-empty
๐ Full Flow
CRON
↓
schedule:run
↓
Scheduler pushes job
↓
CRON triggers queue worker
↓
Processes jobs
↓
Stops
โ ๏ธ Why --stop-when-empty?
-
Prevents hanging processes
-
Safe for shared hosting
๐ Environment Summary
| Environment | Setup |
|---|---|
| Local | Manual |
| VPS | Supervisor |
| Shared Hosting | Cron-based |
โ Common Reasons Laravel Scheduler Not Running
-
Cron job missing
-
Wrong artisan path
-
Queue not running
-
Wrong timezone
-
Empty schedule
๐ง Step-by-Step Fixes
โ Fix 1: Add Cron Job
crontab -e
* * * * * php /your-project/artisan schedule:run
โ Fix 2: Check schedule() Method
$schedule->command('inspire')->everyMinute();
โ Fix 3: Test Manually
php artisan schedule:run
โ Fix 4: Check Queue
php artisan queue:work
โ Fix 5: Check Logs
storage/logs/laravel.log
โ Fix 6: Debug Cron Output
* * * * * php artisan schedule:run >> output.log 2>&1
๐งช Working Example
protected function schedule(Schedule $schedule)
{
$schedule->command('emails:send')
->daily()
->withoutOverlapping();
}
๐ก Best Practices
-
Use one cron job
-
Keep jobs lightweight
-
Use queues for heavy tasks
-
Monitor logs
-
Restart workers after deploy
โ Common Mistakes
-
Forgetting cron
-
Wrong PHP path
-
Not running queue worker
-
Using scheduler incorrectly
โ FAQs (Optimized for Featured Snippets)
Why is Laravel scheduler not running?
Because cron job is missing or misconfigured.
How do I test scheduler?
php artisan schedule:run
Where is scheduler defined?
-
Laravel ≤ 10 →
Kernel.php -
Laravel 11/12 → New structure
Does scheduler need cron?
Yes — always.
Can scheduler run without queue?
Yes, but queued jobs need workers.
๐ Conclusion
If your Laravel scheduler is not running, the issue is almost always:
-
Missing cron
-
Queue worker not running
-
Server limitations
Once you understand:
๐ Cron → Scheduler → Queue → Worker
You can fix any scheduler issue confidently.
๐ Official Docs: https://laravel.com/docs/scheduling