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

在bash脚本上正确格式化crontab可执行文件,bash,ubuntu,cron,Bash,Ubuntu,Cron,为了使bash脚本能够在crontab中成功运行,我在尝试获取正确的格式时遇到了一些严重的问题。当从命令行手动提示时,bash脚本将成功运行。 下面是有问题的bash脚本(实际参数本身[$1&$2]已手动放置在脚本中): 更新的系统日志: 好的,我发现这里有几个问题。首先,您需要将它放在crontab文件中,供希望脚本作为用户运行的用户使用。如果要在您的用户帐户下运行它,请不要仅使用crontab-e而不是sudo crontab-e(使用sudo,它会编辑根用户的crontab文件) 其次,您

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

更新的系统日志:
好的,我发现这里有几个问题。首先,您需要将它放在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