【问题标题】:Crontab - Run in directoryCrontab - 在目录中运行
【发布时间】:2012-02-12 13:24:27
【问题描述】:

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

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

【问题讨论】:

    标签: unix directory relative-path crontab


    【解决方案1】:

    所有作业都由一个shell执行,所以通过一个命令启动那个shell sn-p来改变目录。

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

    关于使用&& 而不是;:通常不会有什么不同,但是如果cd 命令失败(例如,因为目录不存在)&& 应用程序是'未执行,而 ; 已执行(但不在预期目录中)。

    【讨论】:

    • 与其添加大部分重复的答案,我只是补充一点,您可以通过在 crontab 中设置 SHELL 来选择哪个 shell(例如,如果您需要 bash 而不是 sh)。
    • +1。所有其他相关问题的解决方案是用绝对路径重写脚本。这正是我所需要的
    • 出于好奇,您能否使用分号; 代替双& 符号&& 或者这样行不通?为什么?
    • @JoshPinter 通常它没有什么区别。但是如果cd 命令失败(例如,因为目录不存在),使用&&,应用程序不会被执行。使用;,它会被执行(但不在预期的目录中)。
    • 我将对我的应用程序的所有 cron 作业执行此操作,您使我免于更改源文件,非常感谢
    【解决方案2】:

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

    例如

    几个环境变量由 cron(8) 自动设置 守护进程。 SHELL 设置为 /bin/shLOGNAMEHOME 设置自 crontab 所有者的/etc/passwd 行。 HOMESHELL 可以 被 crontab 中的设置覆盖; LOGNAME不能。

    (注意:LOGNAME 变量有时在 BSD 系统上称为 USER 并且也是自动设置的)。

    当然取决于你的 cron,但我的也有 MAILTOMAILFROM CONTENT_TYPECRON_TZRANDOM_DELAYMLS_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
    

    【讨论】:

      猜你喜欢
      • 2019-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-25
      • 2015-06-30
      • 1970-01-01
      • 2015-09-30
      • 1970-01-01
      相关资源
      最近更新 更多