All posts

Cron Log Errors Explained: What They Mean and How to Fix

September 25, 2026

The Cron Log Errors You'll Actually See (and What They Mean)

Most cron content tells you where the logs live. This one assumes you've found them — you're staring at cron error messages and need to know what they mean, how urgent they are, and whether they explain the failure you're chasing.

Cron log errors fall into two buckets. Daemon-level errors come from cron itself — it couldn't find the command, couldn't execute the script, or couldn't deliver output. Script-level errors happen after cron successfully launches your job, when the application logic fails, throws an exception, or exits with a bad status code. Confusing the two wastes time: no amount of fixing your script solves a PATH problem, and no amount of PATH tweaking fixes a bug in your code. If you haven't located your logs yet, this guide to where cron logs live covers syslog, journalctl, and per-distro quirks. What follows is the decoder ring for what you'll find once you're there.

"Command not found" and PATH-related failures

When a cron job fails with command not found, the near-universal cause is environment mismatch. Your interactive shell loads .bashrc, .bash_profile, or .zshrc, which set a generous PATH pointing to /usr/local/bin, version managers, and language runtimes. Cron doesn't load any of that — it runs your job with a minimal environment, often just PATH=/usr/bin:/bin, so anything installed outside those two directories (node, python from a virtualenv, custom binaries) simply isn't found.

This is why a command works flawlessly when run manually and then throws a cron command not found error the moment it's scheduled. The fix: call the command by its absolute path (/usr/local/bin/node instead of node) or set an explicit PATH at the top of your crontab:

PATH=/usr/local/bin:/usr/bin:/bin

A cron PATH error is almost never a sign your command is broken — it's a sign cron never had the information to find it.

"Permission denied" errors

Cron permission denied errors trace back to a handful of usual suspects. The script may not be marked executable (chmod +x script.sh fixes this instantly). The crontab may belong to a different user than the one who owns the script or its target directory — root's crontab running a script owned by another user, or vice versa, will trip permission checks. Output redirection can fail too, if the log file or destination directory is owned by a different user or has restrictive permissions.

Restricted directories are another common trap: cron jobs sometimes write to /var/log or system paths without the privileges to do so, especially after a deploy changes ownership. The quick diagnostic is to run the exact command as the exact user cron uses (sudo -u username /path/to/script.sh), which usually reproduces the error immediately and confirms whether it's a permissions issue rather than a logic bug.

"No MTA installed, discarding output" and mail delivery errors

This is one of the most common lines developers paste into a search bar, and it looks alarming but usually isn't a job failure at all. Cron's MAILTO feature tries to email a job's output using the system's mail transport agent (MTA). If no MTA — like sendmail or postfix — is installed, cron logs "No MTA installed, discarding output" and drops the message instead of sending it.

Your job may have run and finished perfectly; the error is about mail delivery infrastructure, not execution. That said, it means any legitimate warnings or errors your script printed to stdout/stderr just vanished instead of reaching your inbox. For the full breakdown of configuring MAILTO correctly (or replacing it entirely), see the dedicated deep-dive rather than retreading it here — the short version is that a no MTA installed cron message tells you your alerting pipe is broken, not your job.

The job "ran" but the log doesn't confirm success

A cron log entry shows that cron invoked the command at the scheduled time — nothing more. Cron logs the attempt, not the outcome. Whether the job actually accomplished what it was supposed to do is an application-layer question the daemon log can't answer.

This is the gap between daemon logs and application/output logs. The syslog or journalctl entry tells you cron fired the job and, sometimes, its exit code. A non-zero cron exit code is a strong signal something went wrong, but a 0 exit code isn't proof of success either — a script can exit cleanly while silently failing to update a database, hit an API, or write the file it was supposed to write. Getting real cron log success or failure confirmation requires checking your application's own output logs, not just the daemon's invocation record. For the exact commands to filter and cross-reference both, this command reference covers grep patterns and real-time views.

The scariest cron log error: no entry at all

Harder than any error message is the absence of one. A job that should have logged something and didn't is a classic sign of silent cron failure, with several root causes: the crontab was edited but never reloaded, the cron service crashed or was never restarted after a host reboot, a syntax error in the crontab silently disabled the entire file, or a container running the cron process was rebuilt without the daemon starting correctly.

Cron job not running no log situations are undetectable by log-reading, because checking logs assumes the daemon is alive and writing them. If cron itself is down, there's nothing to grep. This category of failure turns "I check logs when something looks wrong" into a false sense of security — you only look when you already suspect a problem, and a job that never fires gives you no reason to look at all.

Why log-reading alone isn't a monitoring strategy

Logs are reactive: they record what already happened, on a machine you have to remember to check. They're also local — tied to the host or container that ran the job — so if that infrastructure disappears or the process never starts, there's no log to consult. Reading logs works well for diagnosing errors you already know occurred. It does nothing for failures you don't know to look for.

That gap is where push-based cron job monitoring earns its place. Instead of you polling logs, an external watchdog expects a check-in from every scheduled job and fires cron failure alerts the moment one is late, missing, or reports a bad exit status — including the "no entry at all" case that log-reading structurally cannot catch.

Frequently Asked Questions

Why does my cron log say "command not found" when the command works fine in my terminal?

Because cron runs jobs with a minimal environment that doesn't load your shell's startup files, using a bare-bones PATH instead of your interactive shell's PATH. Fix it by referencing commands by absolute path or setting an explicit PATH variable inside the crontab.

What does "No MTA installed, discarding output" mean in a cron log?

It means cron tried to email your job's output via MAILTO but found no mail transport agent (like sendmail or postfix) installed, so it discarded the message. It's not a sign your job failed — it's a sign your mail delivery setup is missing or misconfigured.

Why is there no log entry at all for my cron job?

Usually because the cron daemon never actually ran the job — common causes include an unreloaded crontab after editing, the cron service being down, a swallowed syntax error disabling the whole crontab, or a container/host issue preventing cron from starting. If cron never fires, there's nothing for it to log.

Does a cron job that shows no error in the log mean it actually succeeded?

Not necessarily. Cron logs confirm the job was invoked, not that it completed its intended work — a script can exit with status 0 while still failing at the application level. True confirmation requires checking your application's own output logs alongside the cron daemon's invocation record.

How do I tell the difference between a cron scheduling error and a script error?

A scheduling or daemon-level error shows up as cron itself failing to launch the job — permission denied, command not found, or no invocation at all. A script-level error means cron successfully started the job, but the application logic then failed, which you'd see in your program's own output or exit code rather than in the daemon log.

Can a cron job fail without ever writing anything to the log?

Yes — this is the most dangerous failure mode. If the cron service is down, the crontab has a swallowed syntax error, or the host/container never starts the daemon, the job simply never fires and produces zero log output, making it invisible to any log-based check.

Reading and decoding cron log errors solves most day-to-day mysteries, but the failures that matter most — a job that silently stops running, hangs, or never fires again after a deploy — leave no log entry to read in the first place. No amount of grepping fixes a problem you don't know exists. Cronevra acts as an external watchdog for your scheduled jobs: it expects a check-in on schedule and alerts you the moment one goes missing, closing exactly the gap that log-reading alone can't cover. Check the pricing page to see which plan fits your team's job count.