Crontab - Run in directory

UnixDirectoryRelative PathCrontab

Unix Problem Overview


I would like to set a job to run daily in the root crontab. But I would like it to execute it from a particular directory so it can find all the files it needs, since the application has a bunch of relative paths.

Anyway, can I tell crontab to run from a particular directory?

Unix Solutions


Solution 1 - Unix

All jobs are executed by a shell, so start that shell snippet by a command to change the directory.

cd /path/to/directory && ./bin/myapp

Concerning the use of && instead of ;: normally it doesn't make a difference, but if the cd command fails (e.g. because the directory doesn't exist) with && the application isn't executed, whereas with ; it's executed (but not in the intended directory).

Solution 2 - Unix

Reading man 5 crontab should tell you that there's a HOME variable set which can be redefined in the file. It becomes your working directory. You can set PATH for the command(s) too. Of course this affects all the cron schedule lines.

E.G. > Several environment variables are set up automatically by the cron(8) daemon. SHELL is set to /bin/sh, and LOGNAME and HOME are set from the /etc/passwd line of the crontab´s owner. HOME and SHELL can be overridden by settings in the crontab; LOGNAME can not. > > (Note: the LOGNAME variable is sometimes called USER on BSD systems and is also automatically set).

Depending on your cron of course, but mine also has MAILTO, MAILFROM CONTENT_TYPE, CRON_TZ, RANDOM_DELAY, and MLS_LEVEL.

So for your hypothetical app I'd recommend a file name /etc/cron.d/hypothetical containing:

# Runs hypothetical app @ 00:01Z in its local path for reading its config or something.
SHELL=/bin/sh
HOME=/where/the/app/is
PATH=/where/the/app/is:/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
CRON_TZ=UTC
1 0 * * * theappuser hypothetical --with arguments 

For example with docker-compose relying on the cwd docker-compose.yml:

SHELL=/bin/sh
HOME=/path/to/composed-app
5 5 * * * root docker-compose restart -t 10 service-name

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser333746View Question on Stackoverflow
Solution 1 - UnixGilles 'SO- stop being evil'View Answer on Stackoverflow
Solution 2 - UnixdlamblinView Answer on Stackoverflow