Linux

自動檢測文件何時達到大小限制

  • July 22, 2018

我想在文件達到一定大小限制時發送電子郵件。

我想到這樣做的唯一方法是執行一個 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起作用的事件來解決。

參考

引用自:https://unix.stackexchange.com/questions/132054