Cron Every Minute Not Working — Fix Guide

💡If a cron job with * * * * * is not running, the most common causes are the cron daemon not running, the crontab file missing a trailing newline, a script permission error, or the script silently failing. Start by adding a simple echo test to confirm cron itself works, then debug the actual script.

Quick Diagnosis

If you seecron entry saved but job never runs” → it means cron daemon may not be running, or the crontab has no trailing newline do this: verify cron is running (systemctl status cron) and ensure the crontab ends with a newline

If you seejob runs but less frequently than every minute” → it means the script takes longer than 60 seconds, causing overlap prevention do this: check script execution time and add a lock (flock) to prevent overlapping runs

If you see* * * * * runs but output is empty” → it means the script runs but produces no output, or output is redirected to /dev/null do this: add explicit logging inside the script: echo $(date) >> /tmp/cron-test.log

If you seecrontab -l shows the entry but nothing in logs” → it means cron daemon is not processing this user's crontab, or logging is disabled do this: check /var/log/syslog for CRON entries: grep CRON /var/log/syslog | tail -20

Common Fixes

Missing newline at end of crontab

❌ Wrong

# Crontab file with no trailing newline
* * * * * /usr/local/bin/test.sh
# (no newline here — last line may be ignored)

✅ Fixed

# Always end crontab with a blank line
* * * * * /usr/local/bin/test.sh
# ← blank line here ensures the job is parsed

Some cron implementations ignore the last line of a crontab if it has no trailing newline. crontab -e adds it automatically — direct file edits may not.

Testing with a simple log command

❌ Wrong

# Hard to debug — no output
* * * * * /home/user/complex-script.sh

✅ Fixed

# Add a minimal test job first
* * * * * echo $(date) >> /tmp/cron-test.log 2>&1
# If this works but complex-script.sh doesn't,
# the issue is inside the script (PATH, env, permissions)

Start with the simplest possible command to confirm cron itself works, then add complexity.

Validate Your Cron Expression

Confirm your cron expression is syntactically correct and see when it will next trigger before adding it to crontab.

Step-by-Step Debug

  1. 1sudo systemctl status cron — confirm cron daemon is active
  2. 2crontab -l — confirm the entry exists as expected
  3. 3Add: * * * * * echo ok >> /tmp/cron.log 2>&1 — wait 2 minutes
  4. 4cat /tmp/cron.log — if entries appear, cron works fine
  5. 5Run the actual script manually as the cron user to reproduce the error
  6. 6grep CRON /var/log/syslog | tail -30 — look for error messages

Related Guides

Frequently Asked Questions

Is * * * * * valid cron syntax for every minute?

Yes. Five asterisks mean 'every minute of every hour of every day'. It is the most permissive cron schedule. If it is not running, the issue is the cron daemon, permissions, or the script itself.

Can cron miss runs if a job takes too long?

Cron does not automatically skip overlapping runs — it starts a new instance at the next minute regardless. If overlap is a problem, use flock or a PID file to prevent concurrent execution.

How do I confirm cron is actually running my job?

Add a simple test: * * * * * echo 'cron ok' >> /tmp/cron.log 2>&1. After 2 minutes, check /tmp/cron.log. If it has entries, cron works and the problem is in your original script.

All tools run in your browser. Your data never leaves your device.