Crontab - Run in directory
UnixDirectoryRelative PathCrontabUnix 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