我在尝试获取正确的bash脚本格式以便能够在crontab中成功运行时遇到了一些严重的问题。当从命令行手动提示时,bash脚本将成功运行。下面是有问题的bash脚本(实际参数$1和$2已手动放入脚本中):
#!/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行:
# m h dom mon dow command
PATH=/usr/local/bin:/usr/bin:/bin:/root/.local/bin/aws
33 20 * * * /home/ubuntu/s3DeleteByDateSoco1
更新的系统日志:
发布于 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擅长发现常见的问题,比如错误的引用;我建议您通过它运行您的脚本,看看它能找到什么。
https://stackoverflow.com/questions/50748241
复制相似问题