ファイルがサイズ制限に達すると自動的に検出

ファイルがサイズ制限に達すると自動的に検出

ファイルが特定のサイズ制限に達したら、メールを送信したいと思います。

私が考えることができる唯一の方法は、ファイルサイズを確認し、ファイルが必要以上に大きい場合に電子メールを送信するcronjobを実行することです。

しかし、ファイルサイズを確認する(例えば15〜30分ごとに)cronjobを追加することは私にとっては悪い解決策のようです。

ファイルにテキストが添付されている場合(イベント?)を自動的に検出してサイズを確認し、必要な処理を実行するより良い方法があるかどうか疑問に思います。

ベストアンサー1

これを行う2つの方法を考えることができます。設定された頻度で「stat」コマンドを実行するwhileループを使用して、ファイルが必要以上に大きいことを確認するチェックを実行できます。もしそうならメールを送ってください。この方法は有効ですが、ファイルにイベントがあるかどうかにかかわらず、設定された時間頻度で "stat"コマンドを実行するため、少し非効率的になる可能性があります。

別のアプローチは、コマンドを使用してオブザーバを購読できるファイルシステムイベントを使用することですinotifywatch

方法#1 - X秒ごとの例

スクリプトに次のように入力すると、次のようになりますnotify.bash

#!/bin/bash

file="afile"
maxsize=100    # 100 kilobytes

while true; do
    actualsize=$(du -k "$file" | cut -f1)
    if [ $actualsize -ge $maxsize ]; then
        echo size is over $maxsize kilobytes
        .... send email ....
        exit
    else
        echo size is under $maxsize kilobytes
    fi

    sleep 1800 # in seconds = 30 minutes
done

その後、これを実行するとファイルへのすべてのアクセスが報告され、そのアクセスによってファイルサイズが最小サイズを超えると電子メールの送信と終了がトリガーされます。それ以外の場合は、現在のサイズを報告し、ファイルを継続的に監視します。

方法#2 - アクセス例のみを確認する

より効率的なアプローチは、実際にアクセスされたときにのみファイルを確認することです。アクセスの種類はさまざまです。この例では、ファイルアクセスのみを監視する方法を示していますが、ファイルが閉じられるなどの他のイベントのみを監視できます。ファイル名を再指定してくださいnotify.bash

#!/bin/bash

file=afile
maxsize=100 # 100 kilobytes

while inotifywait -e access "$file"; do
    actualsize=$(du -k "$file" | cut -f1)
    if [ $actualsize -ge $maxsize ]; then
        echo size is over $maxsize kilobytes
        .... send email ....
        exit    
    else
        echo size is under $maxsize kilobytes
    fi
done

このスクリプトを実行すると、次の出力が生成されます。

$ ./notify.bash 
Setting up watches.
Watches established.

ファイルに対していくつかのアクティビティを作成すると、ファイルのサイズが次のように報告されます。

$ seq 100000 > afile
$ du -k afile 
576 afile

通知スクリプトの出力:

afile ACCESS 
size is over 100 kilobytes

この時点で終了します。

メールを送信

このアクティビティを実行するには、スクリプトで次のようにします。

subject="size exceeded on file $file"
emailAddr="[email protected]"
mailCmd="mail -s \"$subject\" \"$emailAddrs\""
( echo ""; echo "DATE: $(date)"; ) | eval mail -s "$subject" \"$emailAddr\"

ガイドライン

2番目の方法はほとんどの場合に機能します。 1つのケースは、$maxsizeスクリプトが呼び出されたときにファイルを超え、その種類のファイルに追加のイベントがない場合ですaccess。この問題は、スクリプトで追加のチェックを実行するか、スクリプトが呼び出されたときに実行されるイベントを拡張することでinotifywatch解決できます。

引用する

おすすめ記事