我想将一个作业设置为每天在根crontab中运行。但是我希望它从一个特定的目录执行它,这样它就可以找到它需要的所有文件,因为应用程序有一堆相对路径。

无论如何,我可以告诉crontab从特定目录运行吗?


所有作业都由shell执行,因此通过命令启动该shell片段以更改目录。

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

关于使用&&而不是;:通常没有区别,但如果cd命令失败(例如,因为目录不存在),应用程序不会执行,而使用&&;它被执行(但不在预期的目录中)。


读一读man 5 crontab应该会告诉您,有一个HOME变量集可以在文件中重新定义。它将成为您的工作目录。您也可以为命令设置PATH。当然,这会影响所有cron调度行。

E.G.

几个环境变量由cron(8)自动设置。 守护进程。“SHELL”设置为“/bin/sh”,“LOGNAME”和“HOME”设置从 crontab的所有者的/etc/passwd行。家和壳可以 被crontab中的设置覆盖;LOGNAME不能。 (注意:LOGNAME变量有时在BSD系统上被称为USER 并且也是自动设置的)。

当然,这取决于你的cron,但我的也有MAILTO, MAILFROM CONTENT_TYPE, CRON_TZ, RANDOM_DELAY和MLS_LEVEL。

因此,对于您假设的应用程序,我建议文件名为/etc/crond /假设包含:

# 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 

例如,使用docker-compose依赖于cwd docker-compose.yml:

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