Dateien vor Löschen schützen



  • Ich habe folgendes Problem (Linux, Debian): Ein Programm erzeugt eine Datei, löscht sie aber schnell danach. Wie kann ich ein Skript schreiben, dass alle paar 100ms prüft, ob die Datei da ist, und dann von ihr eine Sicherheitskopie erstellt?



  • #!/bin/bash
    
    if [[ "$1" == "" ]] ; then
        echo "usage: `basename "$0"` filename"
        exit 1
    fi
    
    while test -f $1 ; do
        cp $1 $1.bak
        sleep 0.1
    done
    


  • @debilian:
    Warum pollen? Das kostet unnötig System-Resourcen und außerdem ist es gut möglich, dass ein 100ms-Raster zu grob ist.

    Es gibt unter Debian das Programm inotifywait im Paket "inotify-tools". Damit kannst du auf das Erstellen der Datei warten ohne Polling.

    In Bash kann das ungefähr so aussehen:

    file=$(inotifywait -q -e create --format '%w%f' /ordner/in/dem/die/datei/entstehen/wird)
    cp "$file" "$file_backup"
    

    Das schöne daran ist, dass inotifywait, wie der Name schon sagt, wartet bis die Datei da ist und nicht alle 100ms nachfragt, ob die Datei schon da ist.



  • Achso, die einfachste Methode wär vielleicht die Datei im vorhinein anzulegen und das extended flag +u auf die Datei zu setzen (das geht nur als root):
    # chattr +u datei

    Dann ist die Datei "undeletable" und jedes normale Programm wird die Datei mangels Rechten nicht löschen können. Das klappt aber nur, wenn das Programm, das die Datei anlegt, nicht versucht vorher eine eventuell vorhandene alte Datei zu löschen.



  • Christoph schrieb:

    Achso, die einfachste Methode wär vielleicht die Datei im vorhinein anzulegen und das extended flag +u auf die Datei zu setzen (das geht nur als root):
    # chattr +u datei

    Dann ist die Datei "undeletable" und jedes normale Programm wird die Datei mangels Rechten nicht löschen können. Das klappt aber nur, wenn das Programm, das die Datei anlegt, nicht versucht vorher eine eventuell vorhandene alte Datei zu löschen.

    Funzt nicht, ich kann die Datei als nicht-root löschen.



  • Christoph schrieb:

    @debilian:
    Warum pollen? Das kostet unnötig System-Resourcen und außerdem ist es gut möglich, dass ein 100ms-Raster zu grob ist.

    Es gibt unter Debian das Programm inotifywait im Paket "inotify-tools". Damit kannst du auf das Erstellen der Datei warten ohne Polling.

    In Bash kann das ungefähr so aussehen:

    file=$(inotifywait -q -e create --format '%w%f' /ordner/in/dem/die/datei/entstehen/wird)
    cp "$file" "$file_backup"
    

    Das schöne daran ist, dass inotifywait, wie der Name schon sagt, wartet bis die Datei da ist und nicht alle 100ms nachfragt, ob die Datei schon da ist.

    Und wo muss ich da den Dateinamen einfügen? Für $file?



  • OK, hab ich jetzt gemacht, aber er erstellt das Backup zu früh, d.h. bevor alle Daten in die Datei geschrieben sind.



  • Ich weiß, dass die Datei vollständig ist, wenn gcc aufgerufen wird. Kann man den irgendwie abfangen?



  • Die man page zu lesen war wohl zu viel Aufwand, oder? Versuch's mal mit close_write statt create.



  • Danke. Ich kenne mich damit nicht so aus.



  • womit denn nicht? Mit lesen?



  • Möglich.
    Oder mit selbständig sein.


Log in to reply