在bash脚本上正确格式化crontab可执行文件
为了使bash脚本能够在crontab中成功运行,我在尝试获取正确的格式时遇到了一些严重的问题。当从命令行手动提示时,bash脚本将成功运行。 下面是有问题的bash脚本(实际参数本身[$1&$2]已手动放置在脚本中): 更新的系统日志:在bash脚本上正确格式化crontab可执行文件,bash,ubuntu,cron,Bash,Ubuntu,Cron,为了使bash脚本能够在crontab中成功运行,我在尝试获取正确的格式时遇到了一些严重的问题。当从命令行手动提示时,bash脚本将成功运行。 下面是有问题的bash脚本(实际参数本身[$1&$2]已手动放置在脚本中): 更新的系统日志: 好的,我发现这里有几个问题。首先,您需要将它放在crontab文件中,供希望脚本作为用户运行的用户使用。如果要在您的用户帐户下运行它,请不要仅使用crontab-e而不是sudo crontab-e(使用sudo,它会编辑根用户的crontab文件) 其次,您
好的,我发现这里有几个问题。首先,您需要将它放在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 found”。首先,您需要找出aws(以及您的脚本所依赖的任何其他程序)的位置;您可以在常规shell中使用哪个aws
,来了解这一点。假设它是/usr/local/bin/aws。然后你可以:
- 在命令运行脚本的行之前,向crontab文件添加一行,如
(可能还有您认为合适的任何其他目录)PATH=/usr/local/bin:/usr/bin:/bin
- 在使用aws的行之前,向脚本文件中添加一行,如
(可能还有您认为合适的任何其他目录)PATH=/usr/local/bin:/usr/bin:/bin
- 在脚本中,每次要运行
(类似于aws
)时,都要使用显式路径/usr/local/bin/aws s3api列表对象…
aws
命令(或操作系统附带的核心命令集中没有的任何其他命令)
第四,我不知道哪里提供了$1
和$2
。你说它们是手动放在脚本中的,但我不知道你这是什么意思。由于脚本期望它们作为参数,因此需要在crontab文件中指定它们(即crontab中的命令应该类似于/home/ubuntu/s3DeleteByDateVirginiaSoco1 bucketname模式
)
第五,脚本本身没有遵循好的引用惯例。通常,所有变量引用都应该用双引号引起来。例如,使用grep“$2”
而不是grep$2
。如果没有双引号,包含空格或某些shell元字符的变量可能会导致奇怪的解析问题
最后,为什么要执行fileName=echo$line
(这里不能复制反引号)?这主要是将$line
的值复制到变量fileName
中,但可能会出现我在上一点中提到的那些奇怪的解析问题。如果要可靠地复制变量,只需使用fileName=“$line”
(或fileName=$line
——这是少数几个可以安全地取消双引号的情况之一)
顺便说一句,善于发现常见问题,如错误的引用;我建议您通过它运行脚本,看看它找到了什么。好的,我在这里看到了几个问题。首先,您需要将它放在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 found”。首先,您需要找出aws(以及您的脚本所依赖的任何其他程序)的位置;您可以在常规shell中使用哪个aws
,来了解这一点。假设它是/usr/local/bin/aws。然后你可以:
- 在命令运行脚本的行之前,向crontab文件添加一行,如
(可能还有您认为合适的任何其他目录)PATH=/usr/local/bin:/usr/bin:/bin
- 在使用aws的行之前,向脚本文件中添加一行,如
(可能还有您认为合适的任何其他目录)PATH=/usr/local/bin:/usr/bin:/bin
- 在脚本中,每次要运行
(类似于<aws
#!/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;
# m h dom mon dow command PATH=/usr/local/bin:/usr/bin:/bin:/root/.local/bin/aws 33 20 * * * /home/ubuntu/s3DeleteByDateSoco1