Cron 找不到在终端中运行的可执行文件?

St4*_*b0y 10 path cron

我用 C++ 编写了一个小工具,对其进行编译,使其可执行,并将其移至/opt/tools/bin。后者是我创建的用于存储小型自定义程序的目录。我export把它放在$PATH我的.zprofile中,它让我tool在终端中使用,并且程序运行良好。

然而,当我尝试设置一个 cron 作业tool每天运行几次时,cron 总是抱怨"/bin/sh: ./tool: No such file or directory"

我已经尝试过这两个 cron 命令,结果相同:

  • 0 8,12,16,20 * * * zhrdct >> /opt/tools/var/log/zhrdct.log 2>&1
  • 0 8,12,16,20 * * * ./zhrdct >> /opt/tools/var/log/zhrdct.log 2>&1

这里可能有什么问题?

我知道我可能可以使用工具的绝对路径,但如果可能的话,我希望它可以与速记一起使用。

Rom*_*nov 47

您应该始终使用cron可执行文件的完整路径。它在完全不同的环境中运行,并且许多可执行文件无法“访问”

0 8,12,16,20 * * * /path/to/zhrdct >> /opt/tools/var/log/zhrdct.log 2>&1
Run Code Online (Sandbox Code Playgroud)


小智 15

Cron 在非交互式 shell 中运行,因此您从常规 bash 提示符(配置的 PATH、envvars)中看到的许多功能将有所不同或完全缺失。

如果您想在 cron 中省略绝对路径,则需要从头开始配置 PATH,因为没有可以使用的隐式 PATH 变量:

PATH=/opt/tools/bin:/usr/bin:/bin
0 8,12,16,20 * * * zhrdct >> /opt/tools/var/log/zhrdct.log 2>&1
Run Code Online (Sandbox Code Playgroud)

注意:如果您的脚本包含任何其他二进制文件的简写路径,您需要确保这些路径也添加到 PATH 中。

  • 一般来说,您不想在 CRON 中复制任何环境配置,因为您将定期更新它。只需在 CRON 作业中使用绝对路径,当您看到一个示例条目时,您就会意识到发生了什么。 (11认同)

roa*_*ima 7

这里有两个问题:

\n
    \n
  1. 该目录/opt/tools/bin不会是作业$PATH的默认目录cron。您可以像这样添加它crontab

    \n
    PATH=/opt/tools/bin:/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin\n\n0 8,12,16,20 * * * zhrdct >> /opt/tools/var/log/zhrdct.log 2>&1\n
    Run Code Online (Sandbox Code Playgroud)\n
  2. \n
  3. 一般来说,特别是在使用 时crontab,当您运行zhrdct系统时,会在列出的目录中搜索$PATH指定的命令。如果找不到,则会返回command not found您遇到的错误。但是,如果您指定命令的路径,如./zhrdct或所示/opt/tools/bin/zhrdct,则此搜索将被禁用,并且命令将按指定直接执行。

    \n

    ./zhrdct点的情况下代表“当前目录”。如果crontab您幸运的话,那将恰好是您的主目录 ( $HOME),但它很可能是其他某个未指定的位置。这里你有三个选择

    \n
      \n
    • 设置当前目录( cd "$HOME" && \xe2\x80\xa6commands to run from HOME\xe2\x80\xa6)
    • \n
    • $PATH设置已描述的搜索并运行zhrdct
    • \n
    • 使用命令的绝对路径,例如/opt/tools/bin/zhrdct.
    • \n
    \n
  4. \n
\n

请注意,在任何情况下,./zhrdct如果命令位于/opt/tools/bin并且cron当前目录与其本身不同,则将失败/opt/tools/bin

\n