FTP-Server, Ordner automatisch aufräumen

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hallo, vielleicht kann mir jemand weiter helfen.

    Ich habe eine Raspberry Pi auf welchem ein FTP server installiert ist. Eine Überwachungskamera sendet immer ein Foto wenn jemand vorbei geht.
    Nun werden immer Fotos gespeichert, aber irgendwann ist der Speicher ja voll. So nun meine Frage.
    Gibt es eine Möglichkeit das die ältesten Bilder automatisch gelöscht werden. Zb.: In dem Ordner darf maximal ein GB gespeichert werden. Wenn ein neues Foto kommt wird das älteste gelöscht.

    Hat das schon mal jemand gemacht?

    Vielen Dank

    Einmal editiert, zuletzt von diode1990 (27. März 2017 um 14:28)

  • Hi,
    wie wäre es hiermit: http://askubuntu.com/a/177939/549598, z.B. mit einem Crontab 1x pro Tag oder 1x pro Woche, je nach dem wie viele Bilder so am Tag gemacht werden, d.h. wie frequentiert der überwachte Ort ist...

    Erfüllt zwar nicht diese Anforderung:

    Zitat

    Wenn ein neues Foto kommt wird das älteste gelöscht.

    sollte aber in etwa das tun, was du willst ;)


    LG

  • Zusätzlich zu dem Einzeiler von linusg könntest Du auch noch mtime prüfen (Zeit der letzten Modifikation). Dann nimmst du das älteste Bild und löschst es, wenn ein neueres rein kommt, der Ordner aber mehr als 1Gb Speicher in anspruch nehmen würde.

    Einmal editiert, zuletzt von BallerNacken (27. März 2017 um 15:46)

  • Anstelle von Cron würde ich dafür eher Incron (inotify cron system) nutzen, weil das unmittelbar auf Änderungen im Dateisystem reagiert und nicht in bestimmten Abständen/Intervallen, wie Cron das tut.

    Das Script, das von Incron aufgerufen wird, könnte so aussehen:

    Bash
    #!/bin/bash
    PFAD=$HOME/Bilder/Fotos/Webcam/
    GROESSE=1000000
    while test `awk '{print $1}' < <(du -s "$PFAD")` -gt $GROESSE; do
      rm "$PFAD/`tail -n 1 < <(ls -t "$PFAD")`"
    done

    Damit wird so lange die älteste Datei im Verzeichnis, das in der Variablen $PFAD definiert ist ($HOME bezeichnet den Home-Pfad des aktuellen Benutzers, man könnte auch die Tilte "~" nutzen) bis der Inhalt des Verzeichnisses nicht mehr größer als der Wert der Variablen $GROESSE ist. Diese beiden Variablen müssen natürlich den eigenen Voraussetzungen und Bedürfnissen angepasst werden (die von mir angegeben Werte sollten also keine Rolle spielen). [EDIT] Falls im $PFAD Verzeichnisse mit Leerzeichen vorkommen, sollte der Pfad zwischen Gänsefüßchen ("") stehen, oder die Leerzeichen durch sog. Escape-Sequenzen ersetzt werden, vor dem Leerzeichen müsste dann ein Backslash (\) stehen.
    Ausserdem ist im Script zu beachten, dass die Befehlszeilen mit dem awk- und dem tail-Befehl in sog. Backticks (``) stehen, was das gleiche bedeutet, wie wenn sie in $() stehen würden, und bewirkt, dass die Ausgabe als Variable an die test-Abfrage bzw. den rm-Befehlt übergeben wird.[/EDIT]

    Ich verwende lieber Umleitungen (< <) statt Pipes (|), weil die etwas schneller in der Ausführung sind (vor allem wenn viel verschachtelt wird).
    Zum Beispiel wird hier die Ausgabe des Befehls

    Code
    du -s "$PFAD"

    (der die Größe des Verzeichnisses ermittelt) an den Befehl

    Code
    awk '{print $1}'

    (der gibt die erste Spalte der Ausgabe des "du"-Befehls aus) umgeleitet.

    Mit Pipes würde das so aussehen.:

    Bash
    #!/bin/bash
    PFAD=$HOME/Bilder/Fotos/Webcam/
    GROESSE=1000000
    while test `du -s "$PFAD" | awk '{print $1}'` -gt $GROESSE; do
      rm "$PFAD/`ls -t "$PFAD" | tail -n 1`"
    done


    (Man könnte das auch als Einzeiler schreiben, das wäre dann aber noch etwas unübersichtlicher. Man könnte die Ausgaben der Befehle, die an andere Befehle übergeben werden auch in Variablen speichern, das würde das Script aber in die Länge ziehen.)

    Das Script speichere ich als $HOME/sbin/fotos_aufraeumen ab. Falls das Script mit Root-Rechten ausgeführt werden soll, speichere ich es im Verzeichnis /usr/local/sbin/ ab oder setze einen symbolischen Link dorthin, z.B.

    Code
    su -
    ln -s /home/samtux/sbin/fotos_aufraeumen /usr/local/sbin/


    oder, falls sudo installiert ist,

    Code
    sudo ln -s /home/samtux/sbin/fotos_aufraeumen /usr/local/sbin/

    Incron muss vermutlich installiert werden. Zumindest ist das unter Slackware-ARM so.

    Mit dem Befehl

    Code
    incrontab -e

    in der Kommandozeile wird der Editor für die Konfiguration der inconf-Tabelle gestartet (das kann man als Root oder als User aufrufen).

    Da Incron keine Benutzer-Variablen verarbeitet, muss in der Konfiguration der volle Pfad ausgeschrieben werden.
    Bei mir wird dann die Variable $HOME zu "/home/samtux" und die Konfigurationszeile heißt dann

    Code
    /home/samtux/Bilder/Fotos/Webcam/ IN_CREATE,IN_NO_LOOP /home/samtux/sbin/fotos_aufraeumen
    • In der ersten Spalte steht der (volle) Verzeichnispfad, der überwacht werden soll.
    • Das IN_CREATE in der zweiten Spalte ist das Ereignis, auf welches reagiert werden soll, und bedeutet hier, dass der Befehl beim Erstellen einer neuen Datei ausgeführt werden soll.
      Das IN_NO_LOOP ist ein Ereignisparameter und bedeutet, dass, falls während der Ausführung des Befehls (aus der dritten Spalte), dieser nicht zweimal gestartet werden soll, falls während seiner Ausführung das Ereignis erneut eintritt, sondern gewartet wird, bis er fertig hat.
    • In der dritten Spalte steht der (volle) Pfad zum auszuführenden Befehl, falls das Ereignis aus der zweiten Spalte eintritt.


    Falls das Script mit Root-Rechten ausgeführt werden soll, müssen die Pfade sowohl im Script (hier sollte der volle Pfad stehen, also ohne $HOME-Variable), als auch in der Incron-Konfiguration (der Pfad zum Script) entsprechend angepasst werden, und der Incrontab-Aufruf mit Root-Rechten erfolgen.

    Zitat

    Hat das schon mal jemand gemacht?

    Ja. :D

    Einmal editiert, zuletzt von samtux (27. März 2017 um 21:49)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!