Linux

條件失敗時如何將郵件正文發送為失敗?

  • February 19, 2019

我有一個 S3 儲存桶……每天將在其中上傳文件,我應該郵寄它們……郵件工作正常……但是當文件沒有上傳時,郵件發送時郵件正文為空……如何我可以在郵件正文中添加“失敗”嗎…當條件失敗時

如果文件被上傳,上面的程式碼每天都會郵寄文件……但如果文件沒有上傳,它會以空郵件的正文發送……但如果文件沒有上傳,我應該以“失敗”的形式郵寄如何做到這一點。我嘗試循環它對我不起作用如何在同一個郵件中郵寄兩個 s3 儲存桶內容

為簡單起見,請按以下步驟進行:

  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' abc@gmail.com <"$tmpfile"
else
   mail -s 's3 (failed)' abc@gmail.com <<MESSAGE_END
Something failed.
You should check it.
MESSAGE_END
fi

rm -f "$tmpfile"

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

  1. 正確引用s3:URI(它包含命令替換)。
  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" abc@gmail.com <"$tmpfile"
rm -f "$tmpfile"

commentsaws 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' abc@gmail.com

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

(未經測試)

引用自:https://unix.stackexchange.com/questions/501294