【发布时间】:2012-02-12 13:24:27
【问题描述】:
我想在根 crontab 中设置每天运行的作业。但我希望它从特定目录执行它,以便它可以找到它需要的所有文件,因为应用程序有一堆相对路径。
无论如何,我可以告诉 crontab 从特定目录运行吗?
【问题讨论】:
标签: unix directory relative-path crontab
我想在根 crontab 中设置每天运行的作业。但我希望它从特定目录执行它,以便它可以找到它需要的所有文件,因为应用程序有一堆相对路径。
无论如何,我可以告诉 crontab 从特定目录运行吗?
【问题讨论】:
标签: unix directory relative-path crontab
所有作业都由一个shell执行,所以通过一个命令启动那个shell sn-p来改变目录。
cd /path/to/directory && ./bin/myapp
关于使用&& 而不是;:通常不会有什么不同,但是如果cd 命令失败(例如,因为目录不存在)&& 应用程序是'未执行,而 ; 已执行(但不在预期目录中)。
【讨论】:
SHELL 来选择哪个 shell(例如,如果您需要 bash 而不是 sh)。
; 代替双& 符号&& 或者这样行不通?为什么?
cd 命令失败(例如,因为目录不存在),使用&&,应用程序不会被执行。使用;,它会被执行(但不在预期的目录中)。
阅读man 5 crontab 应该会告诉您有一个HOME 变量集可以在文件中重新定义。它成为您的工作目录。您也可以为命令设置PATH。当然,这会影响所有 cron 计划行。
例如
几个环境变量由 cron(8) 自动设置 守护进程。
SHELL设置为/bin/sh,LOGNAME和HOME设置自 crontab 所有者的/etc/passwd行。HOME和SHELL可以 被 crontab 中的设置覆盖;LOGNAME不能。(注意:
LOGNAME变量有时在BSD系统上称为USER并且也是自动设置的)。
当然取决于你的 cron,但我的也有 MAILTO、MAILFROM CONTENT_TYPE、CRON_TZ、RANDOM_DELAY 和 MLS_LEVEL。
因此,对于您的假设应用,我建议您使用一个文件名 /etc/cron.d/hypothetical,其中包含:
# 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
【讨论】: