Skip to main content
← All use cases

Laravel Cron Monitoring for Scheduled Tasks, Missed Runs, and Failures

Laravel cron monitoring starts with one cron line and a lot of hidden failure modes. The scheduler can look healthy while specific jobs stop running, exit non-zero, or get skipped entirely after a reboot, deploy, or permission change.

If you’re searching for Laravel cron monitoring, this page shows the failure modes that matter most: missed runs, bad exit codes, and silent scheduler outages.

The important part is that you do not need to instrument every task by hand to catch the problem.

Why cron failures go undetected

The standard cron entry discards all output. A PHP fatal error, a missing environment variable, a failed database connection, all of these produce stderr output that goes straight to /dev/null. The cron daemon sees exit code 0, reports success, and moves on.

Even if you capture output, you need something watching that output and alerting when it looks wrong.

Laravel fires ScheduledTaskFailed when a command exits with a non-zero status. But you need a listener wired up to catch it, and that listener only fires for tasks that run and fail. It doesn’t catch tasks that don’t run at all.

What Crontinel monitors

Crontinel hooks into the scheduler’s lifecycle events to capture a run record for every command that executes:

This runs automatically. You don’t add anything to each command. Install the package and the recording starts from the next schedule:run.

Detecting missed runs

A task can fail to run for reasons that have nothing to do with the task itself:

None of these trigger ScheduledTaskFailed. The task simply doesn’t run, and nothing fires.

Crontinel detects missed runs by comparing the last recorded execution time against the expected schedule. If a task that runs every 5 minutes hasn’t run in 10 minutes, an alert fires.

Alert channels

Configure alerts in your .env:

CRONTINEL_ALERT_CHANNEL=slack
CRONTINEL_SLACK_WEBHOOK=https://hooks.slack.com/services/...

Or use email:

CRONTINEL_ALERT_CHANNEL=mail
CRONTINEL_ALERT_EMAIL=alerts@yourcompany.com

PagerDuty and webhook are also supported. Alerts include the task name, failure reason, and a link to the run history.

Monitoring multiple apps

If you run multiple Laravel applications on separate servers or containers, each installs the Crontinel package independently and reports to a shared dashboard using its own API key. You see cron health across all apps in one place.

This is useful for:

Setting up Crontinel for cron monitoring

composer require crontinel/laravel
php artisan crontinel:install

Publish and run the migrations:

php artisan vendor:publish --tag=crontinel-migrations
php artisan migrate

That’s the full setup for local recording. To get cloud alerts and history, connect the app to your Crontinel dashboard using the API key from your account settings.

What the run history looks like

The dashboard shows a timeline for each scheduled task: when it ran, how long it took, and whether it succeeded. Late runs are highlighted. Failed runs show the exit code and captured output.

This is the same information you’d get from reading log files, but organized by task and surfaced without having to SSH into the server.

Cron monitoring checklist

Before considering cron monitoring complete in a production app:

Silent cron failures are a common source of production incidents that never show up in error tracking tools. Crontinel makes them visible.

See also

Start monitoring in minutes

Free for one app. No account needed to install and test locally.

composer require crontinel/laravel
php artisan crontinel:install
Get early access