自動檢測文件何時達到大小限制
我想在文件達到一定大小限制時發送電子郵件。
我想到這樣做的唯一方法是執行一個 cronjob,它將檢查文件大小並在文件大於所需大小時發送電子郵件。
但是,添加一個 cronjob 對我來說似乎是一個糟糕的解決方案,例如每 15-30 分鐘檢查一次文件的大小?
我想知道是否有更好的方法來自動檢測文件何時附加了一些文本(事件?),這樣我就可以檢查大小並進行所需的處理。
我可以設想兩種方法來做到這一點。您可以使用 while 循環以某個設定的頻率執行“stat”命令,執行檢查以查看文件的大小是否超過了您想要的大小。如果有,請發送電子郵件。這種方法可以,但效率可能會有點低,因為無論文件是否有事件,它都會以設定的時間頻率執行“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="user@somedom.com" mailCmd="mail -s \"$subject\" \"$emailAddrs\"" ( echo ""; echo "DATE: $(date)"; ) | eval mail -s "$subject" \"$emailAddr\"
注意事項
第二種方法在大多數情況下都適用。一種情況是,如果文件已經超過
$maxsize
呼叫腳本時的時間,並且類型為 的文件上沒有進一步的事件access
。這可以通過在呼叫腳本時在腳本中執行的額外檢查或通過擴展inotifywatch
起作用的事件來解決。參考