What is the cron job working directory?

By: Shane Harter|Last Updated: Mar 17, 2023

A common problem when setting up a cron job is a misunderstanding about the working directory that cron uses when invoking your job. Clear up any confusion with the best practices in this guide.

Cron jobs run in their owner's home directory

When cron jobs are invoked they are run as the user who owns them. This may be different than the user who schedules them. Figuring out the owner is fairly easy:

When creating cron jobs as...

Cron job "run as" user

$ crontab -e

The current user

$ sudo crontab -e

The root user

$ sudo -u foo crontab -e

The user foo

File in /etc/cron.d/*

The user specified on the cron line

Entry in /etc/crontab

The user specified on the cron line

Once you've identified which user a cron job is run as, with sufficient privileges, you can drop into their home directory and run the script yourself.

$ cd ~username

Avoiding problems with the cron working directory

When scheduling cron jobs, we follow 3 simple best-practices to make life easier.

1. Absolute, not relative

Knowing that jobs are run from the home directory, it can be tempting to quickly hack the relative path to whatever script or command you are trying to run. Your cron job might work fine -- as long as nothing ever changes. Instead, you should put a few extra minutes in when scheduling your job to be specific about what you are trying to run.

2. Change the directory

Invoking a script with an absolute path is more reliable and durable than using a relative path, but for some cron jobs, that may not be enough. If your script is invoking other commands using a relative path, you may need to cd into the same directory as your cron job. Here's an example using an ever-hour cron job:

0 * * * * cd /path/to/command ; cron-job.sh

3. Be consistent

Cron is flexible and can run commands that live anywhere, but your life will be easier if you have the self-discipline to always deploy cron jobs the same way. One idea we like is to add all cron jobs to the same directory and to always invoke that directory when running your job.

In this example, we are always adding cron jobs into Joe's cron directory and using a crontab environment variable to keep the code in our crontab clean.

$ crontab -l CRON_DIR=/home/joe-user/cron 0 * * * * cd $CRON_DIR ; cron-job.sh */15 * * * * cd $CRON_DIR ; python other-cron-job.py

With a clear understanding of how cron invokes your jobs and adherance to a few best practices your cron jobs will be more reliable and more durable.