条件が失敗したときにメッセージ本文を失敗に送信する方法は?

条件が失敗したときにメッセージ本文を失敗に送信する方法は?

S3バケットがあります...ファイルを毎日アップロードしてメールで送信する必要があります...メールはうまく機能しますが、ファイルがアップロードされない場合はメール本文が空白に送信されます...どうすればよいですか?テキストに「失敗」と入力します...条件が失敗したとき

上記のコードは、ファイルがアップロードされると毎日ファイルをメールで送信しますが、ファイルがアップロードされない場合は空のメール本文に送信されます。 、どうすればいいですか?ループで試しましたが、うまくいきませんでした。どのように2つの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. date3回呼び出すのではなく1回呼び出します(そうしないと、特定の時間に実行すると問題が発生する可能性があります)。
  3. -Fe不明な文字列を一致させるには、withを使用してくださいgrep
  4. 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]"

必要に応じて出力文字列を変更できますが、正しく機能することを確認するには、パイプライン(、およびsortheadで次のコマンドを使用する必要があります。awk

関連情報