当条件失败时如何将邮件正文发送为失败?

当条件失败时如何将邮件正文发送为失败?

我有一个 S3 存储桶...其中文件每天都会上传,我应该邮寄它们...邮件工作正常...但是当文件未上传时,邮件将以空邮件正文发送...如何我可以在邮件正文中输入“失败”吗...当条件失败时

如果文件上传,上面的代码每天都会邮寄文件...但是如果文件没有上传,它会以空邮件正文发送...但是如果文件没有上传,我应该以“失败”的形式邮寄,该怎么做。我在循环中尝试过,它对我不起作用我如何在同一封邮件中邮寄两个 s3 存储桶内容

答案1

为简单起见,请分步骤进行:

  1. 将消息保存到临时文件。
  2. 检查消息是否为空。
  3. 采取适当的行动。
  4. 删除临时文件。
#!/bin/sh

tmpfile=$(mktemp)

aws s3 ls "s3://project/js/Historical/$(date +'%Y/%m_%B/')" |
grep -Fe "$DATE" |
sort -rh |
head -n 2 |
awk -v OFS='\t' '{ print $1, $2, $4 }' >"$tmpfile"

if [ -s "$tmpfile" ]; then
    mail -s 's3' [email protected] <"$tmpfile"
else
    mail -s 's3 (failed)' [email protected] <<MESSAGE_END
Something failed.
You should check it.
MESSAGE_END
fi

rm -f "$tmpfile"

另请注意所做的其他更改:

  1. 正确引用 URI s3:(它包含命令替换)。
  2. 调用date一次而不是三次(否则如果在特定时间运行可能会导致问题)。
  3. 使用-Fewithgrep来匹配未知字符串。
  4. 正确引用awk脚本并用于OFS将输出字段分隔符设置为制表符(以提高可读性)。

对于那些不喜欢编写重复代码的人(“DRY”原则):

#!/bin/sh

tmpfile=$(mktemp)

aws s3 ls "s3://project/js/Historical/$(date +'%Y/%m_%B/')" |
grep -Fe "$DATE" |
sort -rh |
head -n 2 |
awk -v OFS='\t' '{ print $1, $2, $4 }' >"$tmpfile"

subject='s3'
if [ ! -s "$tmpfile" ]; then
    subject="$subject (failed)"
    cat >"$tmpfile" <<MESSAGE_END
Something failed.
You should check it.
MESSAGE_END
fi

mail -s "$subject" [email protected] <"$tmpfile"
rm -f "$tmpfile"

评论aws s3 ls,寻求处理两个调用的解决方案。

以下代码将循环存储桶 URI 数组,将每个文件列表放入单独的临时文件中,并在管道产生空结果bash时插入自定义消息。aws最后,所有消息都会被连接并发送出去,然后才会被删除。

#!/bin/bash

bucket=( "s3://project/js/Historical/$(date +'%Y/%m_%B/')" 
         "s3://some-other-path" )

msgfile=()
for uri in "${bucket[@]}"; do
    tmpfile=$(mktemp)

    msgfile+=( "$tmpfile" )

    aws s3 ls "$uri" |
    grep -Fe "$DATE" |
    sort -rh |
    head -n 2 |
    awk -v OFS='\t' '{ print $1, $2, $4 }' >"$tmpfile"

    if [ ! -s "$tmpfile" ]; then
        cat >"$tmpfile" <<MESSAGE_END
Something failed for bucket "$uri".
You should check it.
MESSAGE_END
    fi
done

cat "${msgfile[@]}" | 
mail -s 's3 file listings' [email protected]

rm -f "${msgfile[@]}"

(未经测试)

答案2

我相信该grep命令是您想要实现条件的地方。您可以使用以下语法来实现此目的:

grep ${DATE} && : || echo "Fail"

这是一个 bash 构造,它是标准 if..else..fi 语句的缩短版本。

这里的想法是,如果grep找到匹配项,则不执行任何操作(使用:运算符)。这将允许 grep 的输出流向管道中的下一个命令。

如果grep无法从标准输入中找到匹配项,则输出字符串“Fail”。

完整的管道应该是:

aws s3 ls s3://project/js/Historical/$(date +%Y)/$(date +%m)_$(date +%B/) | grep ${DATE} && : || echo "Fail" | sort -rh | head -n 2 | awk {' print $1"\t"$2"\t"$4'} | mail -s "s3" "[email protected]"

您可以根据需要更改输出字符串,但您需要使用管道中的以下命令(sortheadawk)来验证它是否正常工作。

相关内容