ファイルが特定のサイズ制限に達したら、メールを送信したいと思います。
私が考えることができる唯一の方法は、ファイルサイズを確認し、ファイルが必要以上に大きい場合に電子メールを送信する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
解決できます。