So, we set up a project on a new Digital Ocean droplet and the cron jobs started failing.

Not just that, the log file that we had set up to track the cron was showing up empty!

After a lot of head scratching, I had a look at /var/log/syslog

And I noticed that I kept getting an output like this –

Jan  8 06:27:02 staging CRON[3909]: (CRON) info (No MTA installed, discarding output)

Searching for the anser I came across this AskUbuntu reply. The suggestion was to install postfix

sudo apt-get install -y postfix

Did that. However, the logs were still empty!

Essentially, there were TWO problems.

When cron jobs are run, mails get sent. Per the Postfix page, it is a mail server which sends mail. Since postfix wasn’t installed, these mails were not getting sent.

While installing postfix, especially if it’s being used only for crons, it should be installed with the local-only setting.

So, now the mails were getting sent (to the user who’s set up the cron). That solved half of the first problem. Because, now it meant, there was something wrong with the program and I needed to see the mail to be able to figure that out.

The next step was to be able to read the mail to figure out what the problem was.

For this, I needed to install mailutils

sudo apt-get install -y mailutils

And finally, to read the mail, using

mail

There’s a bunch of mail commands that I’ll put in a separate post.

Finally, reading the mail, I realized the second, and the actual problem –

The cron program (a ruby program) was getting run without being given the path to the root folder of the application and therefore was not able to find the Gemfile and hence not able to load the Ruby Gems, since the first line in the cron was –

Bundler.require

So, the solution to that was to wrap that command up in a Dir.chdir to get to the application root folder.

app_root = File.expand_path(File.join(File.dirname(__FILE__), '../../..'))

Dir.chdir app_root do
  Bundler.require
end