Crontab - 在目录中运行

use*_*746 153 unix directory crontab relative-path

我想在root crontab中设置一个每天运行的工作.但我希望它从特定目录执行它,以便它可以找到它需要的所有文件,因为应用程序有一堆相对路径.

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

Gil*_*il' 283

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

cd /path/to/directory && ./bin/myapp
Run Code Online (Sandbox Code Playgroud)

  • @JoshPinter通常它没有什么区别.但是如果`cd`命令失败(例如因为目录不存在),使用`&&`,则不执行应用程序.使用`;`,它被执行(但不在目标目录中). (31认同)
  • +1.每个其他相关问题的解决方案是用绝对路径重写脚本.这正是我所需要的 (10认同)
  • 出于好奇,你可以使用分号```而不是双&符号`&&`或者那不起作用?为什么? (2认同)

dla*_*lin 20

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

\n

例如

\n
\n

几个环境变量由 cron(8)\ndaemon 自动设置。 SHELL设置为/bin/sh、 和LOGNAMEHOME/etc/passwdcrontab\xc2\xb4s 所有者的行设置的。 HOME并且SHELL可以被 crontab 中的设置覆盖;LOGNAME不能。

\n

(注意:LOGNAME有时会USERBSD系统上调用该变量,并且也会自动设置该变量)。

\n
\n

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

\n

因此,对于您假设的应用程序,我建议/etc/cron.d/hypothetical使用包含以下内容的文件名:

\n
# Runs hypothetical app @ 00:01Z in its local path for reading its config or something.\nSHELL=/bin/sh\nHOME=/where/the/app/is\nPATH=/where/the/app/is:/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin\nCRON_TZ=UTC\n1 0 * * * theappuser hypothetical --with arguments \n
Run Code Online (Sandbox Code Playgroud)\n

例如docker-compose依赖 cwd docker-compose.yml

\n
SHELL=/bin/sh\nHOME=/path/to/composed-app\n5 5 * * * root docker-compose restart -t 10 service-name\n
Run Code Online (Sandbox Code Playgroud)\n