How to Ping Yourself When a Cron Job Fails
Why Silent Cron Job Failures Are a Real Problem
Cron jobs are the invisible workhorses of your infrastructure. They back up databases, send digest emails, sync data between services, and run cleanup scripts — all without you lifting a finger. That is, until one of them quietly breaks.
The dangerous thing about cron job failures is that they are silent by default. There is no pop-up, no alarm, no red light. Your backup job could have been failing for three weeks before you notice your database has no recent snapshot. Setting up a reliable cron job failure alert is one of the highest-leverage things you can do for your server health.
The Classic Approach: Mail and Logs (And Why It Falls Short)
The traditional Unix way to handle cron failures is to let cron email you the output via the MAILTO variable. You set MAILTO=you@example.com at the top of your crontab and hope your server has a working mail transfer agent configured. In practice, this rarely works reliably. Emails land in spam, MTA configurations break, and many modern VPS environments ship without a mail daemon at all.
Checking log files manually is the other fallback — but that requires you to remember to check them. Neither approach gives you the instant ping notification you actually need when something goes wrong at 3 AM.
The Better Pattern: Exit Code Checking + HTTP Ping
Every shell command returns an exit code. Zero means success. Anything else means failure. You can wrap your cron job in a simple conditional that sends an alert only when the exit code is non-zero. Here is the core pattern:
#!/bin/bash
/path/to/your/script.sh
if [ $? -ne 0 ]; then
curl -s "https://pingme.co/ping/YOUR_ENDPOINT" \
-d "message=Cron job failed on $(hostname) at $(date)"
fi
This approach is portable, dependency-free, and works on any Linux or macOS server. The curl command fires an HTTP request to your ping endpoint the moment the job exits with an error, delivering an instant cron job failure alert straight to your device.
Capturing Error Output in Your Alert
Knowing a job failed is useful. Knowing why it failed is essential. Redirect both output streams to a temp file, then include the content in your ping notification:
#!/bin/bash
OUTPUT=$(/path/to/your/script.sh 2>&1)
STATUS=$?
if [ $STATUS -ne 0 ]; then
MSG="Cron failed [exit $STATUS]: $OUTPUT"
curl -s "https://pingme.co/ping/YOUR_ENDPOINT" \
--data-urlencode "message=$MSG"
fi
Now when you receive the alert, you immediately see the traceback, the missing file path, or the database connection error — no SSH session required to start diagnosing the problem.
Setting Up Your Ping Endpoint with pingme.co
To receive alerts, you need a destination. pingme.co lets you create a personal ping endpoint in seconds. Once you have your unique URL, any HTTP request to it triggers an instant notification to your phone, browser, or desktop — whichever channel you prefer.
There is no server to configure, no API key rotation, and no third-party email dependency. You simply point your curl call at your endpoint and the platform handles delivery. This makes it the fastest way to add a real cron job failure alert to any existing script without changing your core logic.
You can also set up multiple endpoints — one for critical database jobs, another for lower-priority cleanup tasks — and route alerts to different notification channels depending on severity.
Testing Your Alert Before You Rely on It
Never assume your alert works until you have tested it end to end. Force a failure intentionally by running a command that you know will exit non-zero:
# Force exit code 1 to test your alert pipeline
(exit 1)
if [ $? -ne 0 ]; then
curl -s "https://pingme.co/ping/YOUR_ENDPOINT" \
-d "message=TEST: cron alert is working"
fi
Run this from the same user account that your cron daemon uses (often root or a service account), not just your personal shell session. Environment variables and PATH settings differ between users, and a script that works interactively can fail silently when run by cron.
Going Further: Heartbeat Monitoring for Cron Jobs
Exit code checking catches failures that produce errors. But some cron jobs fail by never running at all — a misconfigured schedule, a locked process, or a server reboot can cause a job to simply not execute. For these cases, flip the model: send a ping notification on success, and alert yourself if the ping stops arriving.
This is called a heartbeat or dead man's switch pattern. Your job pings a monitoring endpoint every time it completes successfully. If the endpoint does not receive a ping within the expected window, it fires a cron job failure alert to let you know the job has gone silent. Combined with exit code checking, this gives you complete coverage: you are alerted whether the job crashes, hangs, or never starts.
Setting up both patterns takes less than ten minutes and gives you confidence that your scheduled tasks are running exactly as intended — every single time.