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

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • 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

  • Bash | Dateiupload | Feststellen wann Upload der Datei fertig ist?? Schau mal ob du hier fündig wirst!

  • 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.

  • 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.

    2 Mal editiert, zuletzt von RestlessMud46765 (9. März 2022 um 14:39) aus folgendem Grund: -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

    Einmal editiert, zuletzt von Peter0311 (10. März 2022 um 14:06)

  • 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 lLiegt wahrscheinlich an:

    Zitat
    Code
    inotifywait -mq -e close --format %w%f $dir | while read file

    Entferne mal $dir und ersetze close durch close_write

  • 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.

  • 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.

Jetzt mitmachen!

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