Discussion:
inotify benachrichtigt mehrfach
(zu alt für eine Antwort)
Alexander Goetzenstein
2020-12-11 13:29:08 UTC
Permalink
Hallo,
unser Scanner schickt eingescannte PDFs und JPGs per ftp an den Server.
Dort werden sie dann alle 10 Minuten (cron) per unison von den Clients
abgeholt. Sobald sie dort eingetroffen sind, öffnet sich Dolphin, um die
Dateien entsprechend umzubenennen und in die passenden Ordner
wegzusortieren. Das erfolgt mit folgendem Scriptteil, der bei der
[...]
fotokopien=1 # zum bequemen Ein-/Ausschalten
[...]
if [ $fotokopien -eq 1 ]; then
echo 'fotokopien: '$fotokopien >> $log
watchit()
{
inotifywait -mq -e create --format %w $* | while read FILE
do
sleep 10
dolphin --split --new-window $FILE $HOME/Dokumente/Belege &
done
}
watchit1="$HOME/Dokumente/Fotokopien-HV"
watchit2="$HOME/Dokumente/Fotokopien-$USER"
watchit3="$HOME/Dokumente/scan-HV"
watchit4="$HOME/Dokumente/scan-$USER"
watchitparm=$watchit1" "$watchit2" "$watchit3" "$watchit4
echo "Überwachte Verzeichnisse: "$watchitparm >> $log
watchit $watchitparm &
# automatisierten Abgleich der Kopien-Verzeichnisse starten
mv $HOME/.unison/kopien_.prf $HOME/.unison/kopien.prf >> $log 2>> $log
ls -l $HOME/.unison/kopie* >> $log 2>> $log
echo 'fotokopien fertig' >> $log
fi
[...]
Damit gibt es zwei Probleme:

1.: Ist die übertragene Datei so groß, dass die Übertragung über WLAN
etwas dauert, wird für diese eine Datei dolphin mehrfach aufgerufen. Dem
bin ich durch das Einfügen der Zeile mit "sleep 10" begegnet. Ist zwar
nicht ganz sauber, da nicht das Ende der Übertragung/Erstellung der
Datei der Trigger ist, sondern dumpfer Zeitablauf, aber erst einmal
funktioniert das.

2.: Werden mehrere Dateien übertragen (in 10 Minuten kann man einige
Dokumente einscannen), so wird für jedes Dokument ein neues
dolphin-Fenster geöffnet. Hier hilft das sleep 10 nicht, sondern sorgt
nur dafür, dass die dolphin-Fenster in Abständen von 10 Sekunden
geöffnet werden. Das ist nicht nur lästig, sondern kann auch verwirren,
so dass die Gefahr besteht, dass Dokumente übersehen werden, was auch
schon passiert ist. Hier fehlt mir leider die Idee, wie ich das in den
Griff bekommen könnte und hoffe auf Tipps.
--
Gruß
Alex
Bastian Blank
2020-12-11 13:36:47 UTC
Permalink
inotifywait -mq -e create --format %w $* | while read FILE
Du möchtest also wissen, wann eine neue Datei angelegt wird? Eigentlich
ja nicht. Du möchtest wissen wenn die Datei fertig ist. Schau dir mal in
der Hilfe die Events an, "close" könnte eher passen.

Bastian
Marc Haber
2020-12-11 13:57:38 UTC
Permalink
Post by Bastian Blank
inotifywait -mq -e create --format %w $* | while read FILE
Du möchtest also wissen, wann eine neue Datei angelegt wird? Eigentlich
ja nicht. Du möchtest wissen wenn die Datei fertig ist. Schau dir mal in
der Hilfe die Events an, "close" könnte eher passen.
Eigentlich möchte ich wissen, wenn die Applikation fertig ist die
Datei zu schreiben. Besonders bei einem Shellscript kann es vorkommen,
dass die Datei für jede Zeile neu geöffnet und wieder geschlossen
wird.

Grüße
Marc
--
-------------------------------------- !! No courtesy copies, please !! -----
Marc Haber | " Questions are the | Mailadresse im Header
Mannheim, Germany | Beginning of Wisdom " |
Nordisch by Nature | Lt. Worf, TNG "Rightful Heir" | Fon: *49 621 72739834
Alexander Goetzenstein
2020-12-11 15:33:05 UTC
Permalink
Hallo,
Post by Marc Haber
Post by Bastian Blank
inotifywait -mq -e create --format %w $* | while read FILE
Du möchtest also wissen, wann eine neue Datei angelegt wird? Eigentlich
ja nicht. Du möchtest wissen wenn die Datei fertig ist. Schau dir mal in
der Hilfe die Events an, "close" könnte eher passen.
Danke, das probiere ich mal.
Post by Marc Haber
Eigentlich möchte ich wissen,
Du auch? ;-)
Post by Marc Haber
wenn die Applikation fertig ist die
Datei zu schreiben. Besonders bei einem Shellscript kann es vorkommen,
dass die Datei für jede Zeile neu geöffnet und wieder geschlossen
wird.
unison ist kein Script, sondern eine Art gepimptes wechselseitiges
rsync; daher nehme ich an, dass nicht in Zeilen, sondern in Blöcken
geschrieben wird. Dennoch ist das Hauptproblem, dass für jede kurz
aufeinanderfolgend ankommende Datei ein neuer Dolphin-Aufruf erfolgt.
Was ich bräuchte, wäre also so etwas wie ein Timeout vor erneuter
Prüfung auf neue Dateien. Mir fehlt jedoch die Eingebung, wie ich das
scripten könnte.
--
Gruß
Alex
Alexander Goetzenstein
2020-12-11 18:31:37 UTC
Permalink
Hallo,
Post by Alexander Goetzenstein
Post by Bastian Blank
inotifywait -mq -e create --format %w $* | while read FILE
Du möchtest also wissen, wann eine neue Datei angelegt wird? Eigentlich
ja nicht. Du möchtest wissen wenn die Datei fertig ist. Schau dir mal in
der Hilfe die Events an, "close" könnte eher passen.
Danke, das probiere ich mal.
das war keine gute Idee. Zusammen mit dem übermütigen Entfernen des
"sleep 10" ergaben sich mehrere hundert Dolphin-Fenster, bevor ich das
nicht mehr wirklich reagierende System herunterfahren (herunterreißen
wäre treffender) konnte.

Inzwischen bin ich auf inotifywatch gekommen, dem aber leider die
--format Option fehlt, weshalb ich nur mit einem fürchterlichen
Post by Alexander Goetzenstein
inotifywatch -e close_write -t 60 $* 2>/dev/null | grep -v close | cut -c21-
gibt das Verzeichnis ohne weiteren Zusatz aus. Man muss nur darauf
achten, dass das beobachtete Verzeichnis nicht die Zeichenfolge
"close_write" enthält, und es darf auch nur in der einen Minute neu
geschrieben werden -ein Überschreiben bspw. würde die Ausgabe
verfälschen. Leider kann cut nicht das letzte Feld ermitteln, wenn die
Anzahl der Felder variieren kann, weshalb ich dann doch bei -c21-
geblieben bin. Sauber ist was anderes...

Das ganze passt dann aber nicht in die Anmeldung, sondern muss für jeden
Abgleich einzeln aufgerufen werden, das dann wohl mit cron. Darüber
werde ich mich an einem anderen Tag hermachen, heute mache ich
Feierabend, muss den morgigen Sport noch vorbereiten.
--
Gruß
Alex
Marcel Logen
2020-12-12 03:36:55 UTC
Permalink
Post by Alexander Goetzenstein
Leider kann cut nicht das letzte Feld ermitteln, wenn die
Anzahl der Felder variieren kann, weshalb ich dann doch bei -c21-
geblieben bin. Sauber ist was anderes...
Vielleicht kommst Du hier mit awk weiter, etwa so ähnlich:

awk -F ';' '{print $NF}'

wobei Du das Semikolon durch Deinen field separator ersetzen
müßtest.

Marcel
--
╭────────╮ ╭───╮ ╭─╮ ╭─────────╮ ╭──╮ ╭──╮ ╭──
│ ╭───╮ ╰──╯ ╰──╮ ╭─╯ ╰────╮ ╰──────╮ ╰───╮ │ ╰─╮ ╭──╯ ╰─╯
╰──╯ ╭─╯ ╰─╯ │ ╭───╮ │ │ ╭─╯ ╰─╯
──────╯ ╰─╯ ╰───╯ ╰───╯
Marc Haber
2020-12-12 08:45:02 UTC
Permalink
Post by Alexander Goetzenstein
Post by Marc Haber
wenn die Applikation fertig ist die
Datei zu schreiben. Besonders bei einem Shellscript kann es vorkommen,
dass die Datei für jede Zeile neu geöffnet und wieder geschlossen
wird.
unison ist kein Script, sondern eine Art gepimptes wechselseitiges
rsync; daher nehme ich an, dass nicht in Zeilen, sondern in Blöcken
geschrieben wird.
Ich war einen Schritt zurückgetreten und hatte das Problem
generalisiert.

Grüße
Marc
--
-------------------------------------- !! No courtesy copies, please !! -----
Marc Haber | " Questions are the | Mailadresse im Header
Mannheim, Germany | Beginning of Wisdom " |
Nordisch by Nature | Lt. Worf, TNG "Rightful Heir" | Fon: *49 621 72739834
Christian Garbs
2020-12-12 21:57:00 UTC
Permalink
Mahlzeit!
Post by Alexander Goetzenstein
2.: Werden mehrere Dateien übertragen (in 10 Minuten kann man einige
Dokumente einscannen), so wird für jedes Dokument ein neues
dolphin-Fenster geöffnet. Hier hilft das sleep 10 nicht, sondern
sorgt nur dafür, dass die dolphin-Fenster in Abständen von 10
Sekunden geöffnet werden. Das ist nicht nur lästig, sondern kann
auch verwirren, so dass die Gefahr besteht, dass Dokumente übersehen
werden, was auch schon passiert ist. Hier fehlt mir leider die Idee,
wie ich das in den Griff bekommen könnte und hoffe auf Tipps.
Das Teilproblem hatte ich mal grob so gelöst:

inotifywait ... | \
while read -r EVENT; do
while read -r -t 0.1 EVENT; do :; done
# tuwas
done

Die innere Schleife liest alles "weg", was aktuell noch da ist.
Das braucht aber eine bash wegen des Timeouts beim read.

Gruß
Christian
--
....Christian.Garbs....................................https://www.cgarbs.de
Zucker:
Stoff, der den Kaffee bitter macht, wenn man vergißt, ihn hineinzutun.
Lesen Sie weiter auf narkive:
Loading...