首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >正确格式化bash脚本上的crontab可执行文件

正确格式化bash脚本上的crontab可执行文件
EN

Stack Overflow用户
提问于 2018-06-08 02:45:45
回答 1查看 559关注 0票数 0

我在尝试获取正确的bash脚本格式以便能够在crontab中成功运行时遇到了一些严重的问题。当从命令行手动提示时,bash脚本将成功运行。下面是有问题的bash脚本(实际参数$1和$2已手动放入脚本中):

代码语言:javascript
复制
#!/bin/bash
# Usage: ./s3DeleteByDateVirginia "bucketname" "file type"

past=$(date +"%F" -d "60 days ago")

aws s3api list-objects --bucket $1 --query 'Contents[?LastModified<=`'$past'`][].{Key:Key}' | grep $2 | while read -r line
do
fileName=`echo $line`
aws s3api delete-object  --bucket $1 --key "$fileName"
done;

脚本在这个bash文件中: /home/ubuntu/s3DeleteByDateVirginiaSoco1来设置我使用的脚本: sudo crontab -e现在我在网上看到人们说你需要给它一个正确的路径,这对我来说没有任何意义,特别是当我把它放在正确的位置时,因为我在网上看到了很多对它的各种修改,但是它包含这样的格式: SHELL=/bin/sh sPATH=/bin:/sbin:/usr/bin:/usr/sbin,但是我不知道把它放在哪里。

根据syslog,cron功能部分工作,但脚本本身不执行:

除此之外,该脚本具有运行所需的所有适当权限。总而言之,我更困惑的是,当我刚开始的时候,我没有看到太多关于crontab如何工作的文档。

有问题的Crontab:

根据用户的建议进行额外的编辑:以下是我完善的脚本:

下面是crontab行:

代码语言:javascript
复制
 # m h  dom mon dow   command

PATH=/usr/local/bin:/usr/bin:/bin:/root/.local/bin/aws
33 20 * * *  /home/ubuntu/s3DeleteByDateSoco1

更新的系统日志:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-08 04:09:46

好吧,我在这里看到了几个问题。首先,您需要将其放入您希望脚本以其身份运行的用户的crontab文件中。如果您想在您的用户帐户下运行它,请不要只使用crontab -e而不是sudo crontab -e (使用sudo,它将编辑根用户的crontab文件)。

其次,您需要为脚本使用正确的路径和名称;它看起来像是/home/ubuntu/s3DeleteByDateVirginiaSoco1,所以这应该是crontab条目中的内容。如果".sh“实际上不是文件名的一部分,请不要添加它。看起来您还试图在路径前面添加"root“;也不要这样做,因为crontab将尝试将"root”作为命令执行,但它将失败。bash -c不会有什么坏处,但它也没有任何帮助,所以不要使用它。

第三,需要为脚本中使用的可执行文件适当地设置路径。默认情况下,cron作业的执行路径只有"/usr/bin:/bin",所以当您使用aws这样的命令时,它将查找它为/usr/bin/aws,而不是查找它,查找它为/usr/aws,而不是找到它,并给出您在最后一个日志条目中看到的错误"aws: command not find“。首先,您需要找出aws (以及脚本所依赖的任何其他程序)所在的位置;您可以在常规shell中使用which aws来找出这一点。假设它是/usr/local/bin/aws。然后,您可以:

  • 在运行脚本的行之前,将类似PATH=/usr/local/bin:/usr/bin:/bin的行(可能包含您认为合适的任何其他目录)添加到crontab文件中。
  • 在脚本文件中添加类似PATH=/usr/local/bin:/usr/bin:/bin的行(可能包含您认为合适的任何其他目录),在使用crontab脚本的行之前,每次要运行aws (类似crontab)时,请使用显式路径

您可以使用上面的任意一个(或全部),但必须至少使用一个,否则它将无法找到aws命令(或操作系统附带的核心命令集中没有的任何其他命令)。

第四,我不知道$1$2是在哪里提供的。你说它们是手动放在脚本中的,但我不知道你这么说是什么意思。因为脚本需要它们作为参数,所以您需要在crontab文件中指定它们(即,crontab中的命令应该类似于/home/ubuntu/s3DeleteByDateVirginiaSoco1 bucketname pattern)。

第五,脚本本身并不遵循良好的引用约定。一般来说,所有变量引用都应该用双引号括起来。例如,使用grep "$2"而不是grep $2。如果没有双引号,包含空格或某些shell元字符的变量可能会导致奇怪的解析问题。

最后,你为什么要做fileName=echo $line (带有反引号,我不能在这里复制)?这主要只是将$line的值复制到变量fileName中,但可能会出现我在上一点提到的那些奇怪的解析问题。如果希望可靠地复制变量,只需使用fileName="$line" (或fileName=$line --这是少数几种可以安全地去掉双引号的情况之一)。

顺便说一句,shellcheck.net擅长发现常见的问题,比如错误的引用;我建议您通过它运行您的脚本,看看它能找到什么。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50748241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档