Linux
條件失敗時如何將郵件正文發送為失敗?
我有一個 S3 儲存桶……每天將在其中上傳文件,我應該郵寄它們……郵件工作正常……但是當文件沒有上傳時,郵件發送時郵件正文為空……如何我可以在郵件正文中添加“失敗”嗎…當條件失敗時
如果文件被上傳,上面的程式碼每天都會郵寄文件……但如果文件沒有上傳,它會以空郵件的正文發送……但如果文件沒有上傳,我應該以“失敗”的形式郵寄如何做到這一點。我嘗試循環它對我不起作用如何在同一個郵件中郵寄兩個 s3 儲存桶內容
為簡單起見,請按以下步驟進行:
- 將消息保存到臨時文件。
- 檢查消息是否為空。
- 採取適當的行動。
- 刪除臨時文件。
#!/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"
另請注意所做的其他更改:
- 正確引用
s3:
URI(它包含命令替換)。- 呼叫
date
一次而不是三次(如果在特定時間執行可能會導致問題)。- 使用
-Fe
withgrep
來匹配未知字元串。- 正確引用
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"
在comments
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' abc@gmail.com rm -f "${msgfile[@]}"
(未經測試)