【问题标题】:Cronjob fails to run a bash script giving an error "aws : command not found"Cronjob 无法运行 bash 脚本并给出错误“aws:找不到命令”
【发布时间】:2018-01-14 15:59:46
【问题描述】:

我有一个脚本可以使 .sh 文件中的 Amazon CloudFront 无效,当我使用 bash (bash /../filename.sh) 运行它时它运行良好。我需要在每个星期四使我的分发失效,所以我写了一个 cron 作业,但它给出了错误“aws: command not found”。

这是我的 cron 工作 45 10 * * 2 /usr/bin/bash /var/www/cms/file.sh 我错过了什么?为什么 bash 可以运行脚本时 cron 作业失败?

【问题讨论】:

  • 在脚本中添加 aws 命令的完整路径
  • aws cloudfront create-invalidation --distribution-id XXXXXXXXXX --paths '/*' - 我找不到 aws 的相对路径。 aws --version 正在工作,但 /usr/bin 中没有这样的东西,所有其他已安装的实用程序都在那里
  • 输入“whereis aws”
  • 知道了。它在 /usr/local/ 中,在脚本中指定路径后,它就可以工作了。非常感谢@Raman Sailopal

标签: bash amazon-web-services cron putty


【解决方案1】:

这是因为您的系统依赖于环境变量来搜索可执行文件的位置,并且该变量未在 cron 会话中设置。这个变量被命名为$PATH。您只需在终端中输入echo $PATH 即可查看当前会话中的内容。

当为要执行的作业启动 cron 会话时,不会设置此变量。

要解决这个问题,有几种方法:

方法一:

在您的 shell 脚本中使用完整路径名,并且不依赖 PATH 变量来查找可执行文件。


方法二:

在脚本的开头添加以下内容(根据需要进行调整):

PATH=/sbin:/bin:/usr/sbin:/usr/bin

方法三:

(一般不鼓励这种方法)

在您的 crontab 中添加以下行(根据需要进行调整):

PATH=/sbin:/bin:/usr/sbin:/usr/bin

您可以在终端中执行 echo $PATH 并将输出复制到 crontab 中的上述变量中​​。

【讨论】:

  • 对我来说,aws 在 /usr/local 内,在脚本内指定后,cron 作业运行。非常感谢@Sakis
【解决方案2】:

谢谢 Sakis,您的回答对我来说非常有效。 我很困惑为什么我的脚本从命令行运行得很好,但从 cron 运行时出错。原因是我试图从 bash 中使用由于缺少对路径的引用而无法识别的命令的可执行文件。现在很清楚了。 正是这样做 - 不需要 root 或其他 sudo。 在您自己的 shell 中,回显 $PATH。复制此行并输入您自己的 cron(影响该 cron 中的所有作业)或脚本顶部。

PATH=/home/myuser/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

瞧!

【讨论】:

    猜你喜欢
    • 2012-04-12
    • 2016-09-27
    • 2022-01-16
    • 2016-11-09
    • 2021-07-08
    • 1970-01-01
    • 2016-08-12
    相关资源
    最近更新 更多