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.
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
When scheduling cron jobs, we follow 3 simple best-practices to make life easier.
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.
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
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.
Cronitor automatically finds and monitors cron jobs. Complete your setup in minutes.