Roshan Bhandari Roshan Bhandari - 6 months ago 26
Linux Question

CronJob not running

I have setup cronjob for root user in ubuntu environment as follows by typing crontab -e

34 11 * * * sh /srv/www/live/CronJobs/daily.sh
0 08 * * 2 sh /srv/www/live/CronJobs/weekly.sh
0 08 1 * * sh /srv/www/live/CronJobs/monthly.sh


But the cronjon do not run. I have tried checking if the cronjob is running using

pgrep cron

and that gives process id 3033.The shell scrip is calls python file and is used to send email. Running the python file is ok. There's no error in it but the cron doesn't run. The daily.sh file has following code in it.

python /srv/www/live/CronJobs/daily.py
python /srv/www/live/CronJobs/notification_email.py
python /srv/www/live/CronJobs/log_kpi.py

Answer

WTF?! My cronjob doesn't run?!

Here's a checklist guide to debug not running cronjobs:

  1. Is the Cron daemon running?
    • Run ps ax | grep cron and look for cron.
    • Debian: service cron start or service cron restart
  2. Is cron working?
    • * * * * * /bin/echo "cron works" >> /file
    • Syntax correct? See below.
  3. Is the command working standalone?
    • Check if the script has an error, by doing a dry run on the CLI
    • when testing your command, test as the user whose crontab you are editing, which might not be your login or root
  4. Can cron run your job?
    • Check /var/log/cron.log or /var/log/messages for errors.
    • Ubuntu: grep CRON /var/log/syslog
    • Redhat: /var/log/cron
  5. Check permissions
    • set executable flag on the command: chmod +x /var/www/app/cron/do-stuff.php
  6. Check paths
    • check she-bangs / hashbangs line
    • do not rely on environment variables like PATH, as their value will likely not be the same under cron as under an interactive session
  7. Don't Suppress Output, while debugging
    • commonly used is this suppression: 30 1 * * * command > /dev/null 2>&1
    • re-enable the standard output or standard error message output

Still not working? Yikes!

  1. Raise the cron debug level
    • Debian
      • in /etc/default/cron
      • set EXTRA_OPTS="-L 2"
      • service cron restart
      • tail -f /var/log/syslog to see the scripts executed
    • Ubuntu
      • in /etc/rsyslog.d/50-default.conf
      • add or comment out line cron.crit /var/log/cron.log
      • reload logger sudo /etc/init.d/rsyslog reload
      • re-run cron
      • open /var/log/cron.log and look for detailed error output
    • Reminder: deactivate log level, when you are done with debugging
  2. Run cron and check log files again

Cronjob Syntax

# Minute  Hour  Day of Month      Month         Day of Week    User Command    
# (0-59) (0-23)   (1-31)    (1-12 or Jan-Dec) (0-6 or Sun-Sat)  

    0       2       *             *                *          root /usr/bin/find

Crontab Commands

  1. crontab -l
    • Lists all the user's cron tasks.
  2. crontab -e, for a specific user: crontab -e -u agentsmith
    • Starts edit session of your crontab file.
    • When you exit the editor, the modified crontab is installed automatically.
  3. crontab -r
    • Removes your crontab entry from the cron spooler, but not from crontab file.
Comments