Automatisch erkennen, wenn eine Datei eine Größenbeschränkung erreicht hat

7

Ich möchte eine E-Mail senden, wenn eine Datei eine bestimmte Größenbeschränkung erreicht.

Die einzige Möglichkeit, dies zu tun, besteht darin, einen Cronjob durchzuführen, der die Dateigröße überprüft und die E-Mail sendet, wenn die Datei größer als die gewünschte Größe ist.

Es scheint mir jedoch eine schlechte Lösung zu sein, einen Cronjob hinzuzufügen, der beispielsweise alle 15 bis 30 Minuten die Größe einer Datei überprüft.

Ich habe mich gefragt, ob es eine bessere Möglichkeit gibt, automatisch zu erkennen, wann an die Datei Text angehängt wird (Ereignis?), Damit ich dann die Größe überprüfen und die gewünschte Behandlung durchführen kann.

Jean-François Savard
quelle
1
inotifyist etwas, auf das Sie achten sollten.
Ramesh
1
Siehe superuser.com/questions/181517/…. Anschließend können Sie die Dateigrößenprüfung hinzufügen.
harish.venkat

Antworten:

8

Ich kann mir zwei Ansätze vorstellen, um dies zu tun. Sie können entweder eine while-Schleife verwenden, die einen "stat" -Befehl mit einer festgelegten Häufigkeit ausführt und eine Überprüfung durchführt, um festzustellen, ob die Dateigröße Ihre gewünschte Größe überschritten hat. Wenn ja, senden Sie eine E-Mail. Diese Methode ist in Ordnung, kann jedoch etwas ineffizient sein, da der Befehl "stat" unabhängig davon ausgeführt wird, ob ein Ereignis in der Datei vorhanden war oder nicht, und zwar mit der festgelegten Zeitfrequenz.

Die andere Methode umfasst die Verwendung von Dateisystemereignissen, die Sie mithilfe des Befehls für Beobachter abonnieren können inotifywatch.

Methode 1 - Beispiel für alle X Sekunden

Wenn Sie Folgendes in ein Skript einfügen, sagen Sie 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

Wenn Sie es dann ausführen, wird über jeden Zugriff auf die Datei berichtet. Wenn dieser Zugriff dazu führt, dass die Dateigröße Ihre Mindestgröße überschreitet, wird eine E-Mail zum Senden und Beenden ausgelöst. Andernfalls wird die aktuelle Größe gemeldet und die Datei weiter angezeigt.

Methode 2 - Überprüfen Sie nur das Beispiel für Zugriffe

Die effizientere Methode wäre, die Datei nur zu überprüfen, wenn tatsächlich Zugriffe vorliegen. Die Arten von Zugriffen können variieren. In diesem Beispiel wird veranschaulicht, wie nur Dateizugriffe überwacht werden. Sie können jedoch nur andere Ereignisse überwachen, z. B. das Schließen der Datei. Wieder werden wir diese Datei benennen , 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

Das Ausführen dieses Skripts würde zu folgender Ausgabe führen:

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

Die Datei generiert eine Aktivität für die Datei und gibt nun die folgende Größe an:

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

Die Ausgabe unseres Benachrichtigungsskripts:

afile ACCESS 
size is over 100 kilobytes

An welchem ​​Punkt würde es verlassen.

Email schicken

Um diese Aktivität auszuführen, können Sie einfach Folgendes im Skript ausführen:

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

Überlegungen

Die zweite Methode funktioniert in den meisten Situationen. $maxsizeDies ist nicht der Fall, wenn die Datei bereits den Zeitpunkt überschreitet, an dem das Skript aufgerufen wird, und die Datei vom Typ keine weiteren Ereignisse enthält access. Dies kann entweder durch eine zusätzliche Überprüfung des Skripts beim Aufrufen oder durch Erweitern der Ereignisse behoben werden, auf die inotifywatchreagiert wird.

Verweise

slm
quelle