Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CronJob not running

I have set up a 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 cronjob does not run. I have tried checking if the cronjob is running using pgrep cron and that gives process id 3033. The shell script calls a python file and is used to send an email. Running the python file is ok. There's no error in it but the cron doesn't run. The daily.sh file has the 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 
like image 436
bor Avatar asked Mar 30 '14 11:03

bor


People also ask

Why does my cron job not run?

Crontab might fail for a variety of reasons: The first reason is that your cron daemon might not be working for any reason, resulting in your crontab failing. There also exists a possibility that your system's environment variables are not settled correctly.

How do you check the cron job is running or not?

To check to see if the cron daemon is running, search the running processes with the ps command. The cron daemon's command will show up in the output as crond. The entry in this output for grep crond can be ignored but the other entry for crond can be seen running as root. This shows that the cron daemon is running.

Does crontab run automatically?

Cron reads the crontab (cron tables) for predefined commands and scripts. By using a specific syntax, you can configure a cron job to schedule scripts or other commands to run automatically.


1 Answers

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
  1. Is cron working?
  • * * * * * /bin/echo "cron works" >> /tmp/file
  • Syntax correct? See below.
  • You obviously need to have write access to the file you are redirecting the output to. A unique file name in /tmp which does not currently exist should always be writable.
  • Probably also add 2>&1 to include standard error as well as standard output, or separately output standard error to another file with 2>>/tmp/errors
  1. 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
  1. 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
  1. Check permissions
  • Set executable flag on the command: chmod +x /var/www/app/cron/do-stuff.php
  • If you redirect the output of your command to a file, verify you have permission to write to that file/directory
  1. 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. See How to get CRON to call in the correct PATHs
  1. 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 by removing >/dev/null 2>&1 altogether; or perhaps redirect to a file in a location where you have write access: >>cron.out 2>&1 will append standard output and standard error to cron.out in the invoking user's home directory.
  • If you don't redirect output from a cron job, the daemon will try to send you any output or error messages by email. Check your inbox (maybe simply more $MAIL if you don't have a mail client). If mail is not available, maybe check for a file named dead.letter in your home directory, or system log entries saying that the output was discarded. Especially in the latter case, probably edit the job to add redirection to a file, then wait for the job to run, and examine the log file for error messages or other useful feedback.
  • If you are trying to figure out why something failed, the error messages will be visible in this file. Read it and understand it.

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.* /var/log/cron.log
    • reload logger sudo /etc/init.d/rsyslog restart
    • re-run cron
    • open /var/log/cron.log and look for detailed error output
  • Reminder: deactivate log level, when you are done with debugging
  1. 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 

This syntax is only correct for the root user. Regular user crontab syntax doesn't have the User field (regular users aren't allowed to run code as any other user);

# Minute  Hour  Day of Month      Month         Day of Week    Command     # (0-59) (0-23)   (1-31)    (1-12 or Jan-Dec) (0-6 or Sun-Sat)                 0       2       *             *                *          /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.
like image 121
Jens A. Koch Avatar answered Oct 13 '22 05:10

Jens A. Koch