S3バケットがあります...ファイルを毎日アップロードしてメールで送信する必要があります...メールはうまく機能しますが、ファイルがアップロードされない場合はメール本文が空白に送信されます...どうすればよいですか?テキストに「失敗」と入力します...条件が失敗したとき
上記のコードは、ファイルがアップロードされると毎日ファイルをメールで送信しますが、ファイルがアップロードされない場合は空のメール本文に送信されます。 、どうすればいいですか?ループで試しましたが、うまくいきませんでした。どのように2つのs3バケットコンテンツを同じメールで送信できますか?
答え1
簡単にするには、次の手順を実行してください。
- メッセージを一時ファイルに保存します。
- メッセージが空であることを確認してください。
- 適切な措置を講じてください。
- 一時ファイルを削除します。
#!/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"
また、他の変更も確認してください。
- URIを正しく引用してください
s3:
(コマンドの置き換えが含まれています)。 date
3回呼び出すのではなく1回呼び出します(そうしないと、特定の時間に実行すると問題が発生する可能性があります)。-Fe
不明な文字列を一致させるには、withを使用してくださいgrep
。awk
スクリプトを正しく引用し、OFS
出力フィールド区切り文字をタブに設定するために使用します(読みやすくするため)。
繰り返しコードを書くのが好きではない人のために(「乾燥」原理):
#!/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"
これは標準のif..else..fiステートメントの短縮バージョンであるbash構成です。
ここでのアイデアは、一致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]"
必要に応じて出力文字列を変更できますが、正しく機能することを確認するには、パイプライン(、およびsort
)head
で次のコマンドを使用する必要があります。awk