我有一个脚本可以在.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作业失败了?
答案 0 :(得分:0)
这是因为您的系统依赖于环境变量来搜索可执行文件的位置,并且该变量未在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中的上述变量中。
答案 1 :(得分:0)
谢谢Sakis,您的回答对我来说非常有效。 我不知道为什么我的脚本可以从命令行正常运行,但是从cron运行时却出错。原因是我试图从bash中使用一个可执行文件,由于缺少对路径的引用,该文件不是公认的命令。现在很清楚。 确实做到了这一点-不需要root或其他sudo。 在您自己的外壳中,回显$ 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
瞧!