web-dev-qa-db-ja.com

一度エラーを見つけて送信された場合に同じメールの繰り返しを停止するシェルスクリプト

ログ内のWordを模索し、そのWord(エラー)が検出された場合に電子メールを送信するスクリプトを作成しました。スクリプトは1時間ごとに実行され、そのWord(エラー)エラーが見つからない可能性があります。

そのため、1時間ごとに実行されるスクリプトは、そのエラーが見つかった場合に1時間ごとに同じメールを送信します。2回または1回だけ送信を停止するにはどうすればよいですか。

if grep 'error' "/path to log"; then
    echo "error found" | mailx -s "error alert" email-id
fi
1
Aravind

フラグ(またはカウンター)としていくつかの変数(またはファイル)を使用する2番目の条件を使用できます。

たとえば、ファイルをフラグとして使用するには、次の方法でスクリプトを変更できます。

#!/bin/bash

FLAG_FILE="/tmp/flag_file_my_error_email_script"

if grep -iq 'error' "/path/to/log" && [ ! -f "${FLAG_FILE}" ]; then
        echo "error found" | mailx -s "error alert" email-id
        touch "$FLAG_FILE"
fi

コマンドtouch "$FLAG_FILE"は、2番目の条件/tmp/flag_file_my_error_email_scriptの引数として使用されるファイル[ ! -f "${FLAG_FILE}" ]を作成します。 Bash条件式について読む

特定の数の電子メールを送受信し、スクリプトの機能を抑制する場合、3番目の条件を追加できます。この場合、$FLAG_FILEのコンテンツは counter として使用されます。

#!/bin/bash

FLAG_FILE="/tmp/flag_file_my_error_email_script"

if grep -iq 'error' "/path/to/log" && [ ! -f "${FLAG_FILE}" ] || (( $(cat "$FLAG_FILE") < 2 )); then
        echo "error found" | mailx -s "error alert" email-id
        touch "$FLAG_FILE"
        NEW_VALUE=$(( $(cat "$FLAG_FILE") + 1)) && echo "$NEW_VALUE" > "$FLAG_FILE"
fi

&&の意味は前の条件がtrueを意味し、||の意味は- 前の条件がfalse]を返す場合

スクリプトの「通常の」作業を復元する場合は、$FLAG_FILEを削除する必要があります。このファイルは、システムの再起動時に自動的に削除されます。その動作を変更する場合は、スクリプトを実行するユーザーが書き込み権限を持っている/tempとは異なるディレクトリを選択してください。

0
pa4080