Bash | Dateiupload | Feststellen wann Upload der Datei fertig ist?

  • Hallo,

    in einem Bash-Script wird ein Verzeichnis auf neue Inhalte (PDF) geprüft (inotifywait) und falls was vorhanden ist gedruckt (Übergabe an CUPS).


    Je nach Größe und Anzahl der Seiten benötigt der Dokumentenscanner manchmal etwas länger. Bisher hatte ich im Script einfach eine "sleep"-Funktion (15 Sekunden). Aber ab und zu reicht das auch nicht aus.


    Schöner wäre ja, wenn das Script prüft, ob das Dokument schon fertig hochgeladen ist.


    Hat jemand dazu eine Idee wie ich das in einem Bash-Script prüfen kann?

    Viele Grüße,

    Peter

  • Ich glaube, dass wir (noch) aneinander vorbeireden oder ich es noch nicht verstanden habe.


    Mein Script sieht bisher so aus:

    Das Script läuft als service auf dem Pi. Sobald ein Dokument im Ordner landet, wartet er 15 Sekunden (sleep 15), schickt das Dokument zum Drucker und löscht es. Den "sleep 15" würde ich gerne gegen eine Prüfung austauschen, die prüft, ob das Dokument schon vollständig ist.


    Ich habe schon an einen Hash gedacht (md5sum), sprich den Hash nacheinander vergleichen und nur bei gleichen Hash den Druck auszuführen. Ich hatte aber gehofft, dass es eine einfachere Abfrage gibt.

    Viele Grüße,

    Peter

  • Du solltest schon wie Rasp-Berlin geschrieben hat auf den close Event warten.


    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect."

    Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert :fies: Bei mir tut das raspiBackup automatisch :shy:

  • Das Ereignis close_write kommt immer dann, wenn eine Datei, die beschrieben worden ist, geschlossen wurde.

    D.h. die Datei existiert dann und kann dann auch direkt gedruckt werden.

    Den sleep nach lp $file kannst du ggf. auch entfernen, sofern lp so lange blockt, bis CUPS den Druckauftrag hat.


    Edited 2 times, last by DeaD_EyE: -q -m quotes ().

  • Vielen Dank für die Hilfestellung.


    Ich habe jetzt ein wenig rumgetestet und nun alle Parameter verstanden. Es klappt nun wunderbar.


    Inotifywait wartet solange bis der Dokumentenscanner die Datei hochgeladen hat und löst dann erst den Druckvorgang aus. Perfekt.

    Viele Grüße,

    Peter

  • Deiner Lösung teilhaben

    Gerne. Die Lösung ist aber nicht meine, sondern die von DeaD_EyE , die man unter #6 findet. Im Grunde habe ich nichts relevantes geändert.


    Was ich gemacht habe: Mehrfach getestet (Scan und Reaktion vom Script) und die einzelnen Parameter mir genauer angeschaut, damit ich es besser verstehe. Dank dem "close_write" wartet inotifywait solange bis der Upload erledigt ist. Da lag auch mein Fehler. Bei mir war dort ein "create", was natürlich sofort ausgelöst hat.


    Getestet habe ich das veränderte Script mit dem Dokumentenscanner und Scans mit 12 und mehr Seiten. Klappt tadellos.

    Viele Grüße,

    Peter

    Edited once, last by Peter0311 ().

  • Die Lösung von framp finde ich besser, da inotifywait nur einmal im Monitor-Modus gestartet wird.

    D.h. der Prozess gibt mehr als eine Zeile aus und wird nie beendet.


    Jede Zeile wird einzeln dem Befehl read eingelesen und der Variable file zugewiesen.

    Code
    befehl_mit_ausgabe | while read file; do
        echo $file
    done;

    Die Ausgabe des Befehls (ein Programm) wird an stdin des Programms read weitergeleitet, dass dann das eingelesene einer Variable zuweist. Der Programm read wird dann beendet und gibt den Fehlercode 0 zurück. Die while-Schleife wertet den Rückgabewert des Programms read aus. Nur einem anderen Returncode als 0 wird die while-Schleife unterbrochen.


    Solange das Programm befehl_mit_ausgabe nichts ausgibt, wartet read und die while-Schleife wartet auf read.

  • Ich hatte mit framp seiner Lösung kurz rumexperimentiert. Da gab es aber Probleme mit den Variablen.

    Ich hatte nur das Verzeichnis angepasst, sowie für den Test den Druckbefehl mit einer Raute versehen.


    Beim Ausführen mit bash -x bekam ich folgende Ausgabe:

    Daher hatte ich das andere Script von dir ausprobiert, was auf Anhieb funktionierte.

    Viele Grüße,

    Peter

  • Das habe ich versucht. Dann kommt das (bash -x):

    Code
    + dir=/home/shares/pi/drucken
    + inotifywait -mq -e close_write --format %w%f
    + read file
    No files specified to watch!
    
    (Script wird beendet)

    Viele Grüße,

    Peter

  • Bei mir funktioniert das ohne Probleme. Starten und dann per touch /home/pi/d/datei1

    Beim Ausführen mit bash -x bekam ich folgende Ausgabe:

    D.h. ohne dass eine Datei in das Verzeichnis reingeschrieben wurde in einer Endlosschleife? Offensichtlich closed da jemand in dem Verzeichnis staendig.Aendere mal nur close in close_write denn close beinhaltet auch noch close_read was wohl zu dem Problem fuehrt.

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect."

    Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert :fies: Bei mir tut das raspiBackup automatisch :shy:

  • Aendere mal nur close in close_write

    Das war schon in #13 geschehen. Bei dem Versuch hatte ich aber die Variabel vom $dir entfernt. Das habe ich nun korrigiert und nun funktioniert es.


    So, nun haben wir zwei Versionen ( framp und von DeaD_EyE ) , die nach einem Test beide funktionieren.


    Version framp:

    Version DeaD_EyE:

    So kann jeder den für sich richtigen Weg nehmen und beide Scripte sind funktionsfähig für die Nachwelt hinterlegt.


    Vielen Dank an alle Beteiligten.

    Viele Grüße,

    Peter

  • Irgendein Thread scheint bei Dir auf dem Verzeichnis regelmaessig zu lesen. Deshalb gab es die Probleme mit close Mit close_write ist das Problem weg :thumbup:


    Beides funktioniert nun. Nimm das was Dir gefaellt :) Es gibt immer verschiedene Wege um nach Rom zu kommen.

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect."

    Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert :fies: Bei mir tut das raspiBackup automatisch :shy: