Script starten wenn eine Datei existiert

Du hast Probleme mit Deinem eMail-Programm, Webbrowser oder Textprogramm? Dein Lieblingsprogramm streikt?
Antworten
Richard
Beiträge: 639
Registriert: 11.10.2012 14:18:37
Lizenz eigener Beiträge: GNU General Public License

Script starten wenn eine Datei existiert

Beitrag von Richard » 01.12.2018 08:30:37

Hallo,

ich habe hier einen Raspberry Pi an dem sowohl ein Sender für Infrarot als auch Funk (433 Mhz) angeschlossen sind, damit kann ich einige meiner Gerätschaften steuern. Ich lasse z. B. Geräte im Wohnzimmer (Sat-Receiver, HTPC) Nachts ausschalten. Beide schicken Inhalte über LAN an meinen Fernseher im Schlafzimmer - der kann die aber nichts ausschalten. Automatisch per Smartphone direkt den Befehl an den Pi zu senden geht nicht, da dem Smartphone echtes SSH fehlt (Apps wie JuiceSSH können nicht was ich hier brauche), daher dieser Umweg:
  • Smartphone sendet zeitgesteuert per Tasker und FolderSync eine leere Datei an den Pi
  • auf dem Pi läuft ein Script, dass auf die Existenz der Datei wartet und dann ein Script ausführt

Code: Alles auswählen

while true ; do
 if [ -f /home/pi/.htpc-off ] ; then
  #datum=$(date +%Y-%m-%d_%H-%M-%S)
  /home/pi/htpc-aus
  sleep 5
  rm -f /home/pi/.htpc-off
  #mv /home/pi/test.txt /home/pi/test-"$datum"
 fi
done
Das Script wird nach dem Start des Pi per Cron (@reboot) gestartet. Das Script startet ein weiteres Script "htpc-aus" mit dem der IR-Befehl gesendet wird, wartet 5 Sekunden und löscht die Datei wieder. Die auskommentierten Dateien dienen nur Tests. Im Moment sende ich per Handy auch die Datei "test.txt" die dann umbenannt und mit dem Zeitpunkt der Umbenennung versehen werden soll. Damit ich sehe ob/wann das Script ausgeführt wurde.

Probleme: Manchmal geht es, manchmal nicht. Wenn ich die Datei "htpc-aus" manuell erstelle dauert es dennoch ca. 10 Sekunden bis das Script sie löscht, dabei sollte es doch in Endlosschleife laufen. Dann wird auch nur das Script ausgeführt und die Datei gelöscht, aber nie etwas umbenannt und auch nicht immer das Script gestartet. Starte ich das Script (das auf die Existenz der Datei prüft) manuell, wird alles ausgeführt.

Liegt hier ein Fehler vor? Sollte man hier lieber mit inotify arbeiten? Wenn ich da

Code: Alles auswählen

inotifywait -mq -e create --format %w%f /home/pi/.htpc-aus | while read FILE
do
    echo "Die Datei $FILE wurde gerade erstellt."
done
(Bsp. aus dem UU-Wiki) ausführe kommt
Couldn't watch /home/pi/datei/: No such file or directory
Logisch, er soll ja erst warten bis die Datei erstellt wurde. Kann inotify nur Ordner und nicht konkrete Dateien überwachen?

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Script starten wenn eine Datei existiert

Beitrag von Meillo » 01.12.2018 09:02:53

Nur ganz kurz etwas, das mir nebenher aufgefallen ist: Wenn die Datei nicht existiert, dann geht dein Script in eine Busy-Loop. Achte darauf, dass das sleep immer ausgefuehrt wird, am besten mittels ``while sleep 5; do...''.
Use ed once in a while!

Richard
Beiträge: 639
Registriert: 11.10.2012 14:18:37
Lizenz eigener Beiträge: GNU General Public License

Re: Script starten wenn eine Datei existiert

Beitrag von Richard » 01.12.2018 09:19:52

Was heißt denn "Busy Loop"? Du meinst die erste Schleife ohne inotify? Ich dachte if prüft dann dauerhaft ob sie existiert und wenn ja, wird alles ausgeführt.

Denke aber inotify wäre hier besser. Problem: Ich kann scheinbar nur ganze Ordner und nicht einzelne Dateien überwachen. Mit eigenem Ordner geht es aber. Er scheint aber nur Dateien zu finden die das erste mal erstellt wurden. Wird die gleiche Datei nochmal erstellt reagiert inotify nicht. Kann ich das Verhalten ändern?

inne
Beiträge: 3273
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Script starten wenn eine Datei existiert

Beitrag von inne » 01.12.2018 09:53:35

Richard hat geschrieben: ↑ zum Beitrag ↑
01.12.2018 08:30:37
Kann inotify nur Ordner und nicht konkrete Dateien überwachen?
Das liegt wohl am Event create, das kann nur von Verzeichnissen ausgelöst werden. Wenn du aber verz/dat erstellst, solltest Du das im Output abfragen können:

Code: Alles auswählen

inotifywait -e create -m -r --format '%:e %f' verz | while read REPLY; do
    if test "$REPLY" = "CREATE dat"; then
        : # do something here - break?
    fi
done
So o.ä. ungetestet!
Zuletzt geändert von Anonymous am 01.12.2018 10:40:30, insgesamt 1-mal geändert.

Richard
Beiträge: 639
Registriert: 11.10.2012 14:18:37
Lizenz eigener Beiträge: GNU General Public License

Re: Script starten wenn eine Datei existiert

Beitrag von Richard » 01.12.2018 10:39:19

Es wäre auch kein Problem einfache einen Ordner zu erstellen und den zu überwachen. Problematischer ist derzeit aber, dass inotify nichts macht wenn die gleiche Datei erneut erstellt wird.

Oder sieht er das als "verschieben" (move) an? Dann verstehe ich aber nicht wieso es beim allerersten Versuch funktionierte.

inne
Beiträge: 3273
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Script starten wenn eine Datei existiert

Beitrag von inne » 01.12.2018 10:48:05

Richard hat geschrieben: ↑ zum Beitrag ↑
01.12.2018 10:39:19
Problematischer ist derzeit aber, dass inotify nichts macht wenn die gleiche Datei erneut erstellt wird
Habe meine Schleife oben nun unter Knoppix im Test und kann das nicht nachvollziehen. Ein touch verz/dat ; rm verz/dat ; touch verz/dat löst auch zweimal aus.
Richard hat geschrieben: ↑ zum Beitrag ↑
01.12.2018 10:39:19
Oder sieht er das als "verschieben" (move) an?
Das Event für mv gibt es auch!
Zuletzt geändert von Anonymous am 01.12.2018 11:08:00, insgesamt 1-mal geändert.

inne
Beiträge: 3273
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Script starten wenn eine Datei existiert

Beitrag von inne » 01.12.2018 10:56:53

Richard hat geschrieben: ↑ zum Beitrag ↑
01.12.2018 10:39:19
Dann verstehe ich aber nicht ...
:arrow: https://manpages.debian.org/inotifywait und https://manpages.debian.org/inotify s. inotify events.
PS: Lass zum Test und besseren Verständnis auch mal Example 3 laufen ;-)

Richard
Beiträge: 639
Registriert: 11.10.2012 14:18:37
Lizenz eigener Beiträge: GNU General Public License

Re: Script starten wenn eine Datei existiert

Beitrag von Richard » 01.12.2018 17:56:00

Um mal zu testen ob inotify ein Verschieben über das Handy anders handhabt als wenn ich direkt mit touch eine Datei erstelle hab ich das ganze nochmal beobachtet. Es kommt die Ausgabe

Code: Alles auswählen

Die Datei /home/pi/speaker-off/speaker-off.tacitpart wurde gerade erstellt.
Ich vermute das tacitpart hat irgendwas mit einer partiellen Übertragung zu tun. inotify reagiert schon wenn die Datei nur teilweise übertragen wurde. Da ich dann auch den Dateinamen wie er von inotify übernommen wurde in rm einsetze, die Datei aber inzwischen korrekt umbenannt wurde, wurde sie nicht gelöscht.

Erstmal nur eine Vermutung.

inne
Beiträge: 3273
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Script starten wenn eine Datei existiert

Beitrag von inne » 01.12.2018 18:29:19

Richard hat geschrieben: ↑ zum Beitrag ↑
01.12.2018 08:30:37
... da dem Smartphone echtes SSH fehlt (Apps wie JuiceSSH können nicht was ich hier brauche)
Kann man das Skript wirklich nicht direkt via SSH aufrufen, wenn Du doch gesteuert auch eine Datei ablegen kannst?!
Was genau brauchst Du denn, was dort nicht gegeben ist? Der AppStore FDroid überrascht mich oft mit super Apps, such dort doch mal nach SSH (https://search.f-droid.org/?q=ssh).

So long, ich lese noch gespannt mit.

Richard
Beiträge: 639
Registriert: 11.10.2012 14:18:37
Lizenz eigener Beiträge: GNU General Public License

Re: Script starten wenn eine Datei existiert

Beitrag von Richard » 01.12.2018 18:37:34

Am Smartphone hab ich das so automatisiert: Ein Tasker-Profil angelegt, das
1.) WLAN anschaltet
2.) 15s wartet
3.) mit FolderSync eine leere Textdatei zum Samba-Server des Pi sendet
4.) 15s wartet
5.) WLAN ausschaltet

Der ganze Task wird über einen TimerTask nach einer bestimmten Zeit gestartet. Der TimerTask liegt als Widget auf dem Homescreen.

Das Smartphone ist zwar gerootet, ist aber nur ein billiges Doogee mit entsprechend begrenztem Interesse innerhalb der Entwicklergemeinde, daher war es schon schwierig es zu rooten, auf ein Custom-ROM (LineageOS o.a.) bin ich gar nicht umgestiegen. Damit ich den Befehl direkt per SSH senden könnte brauche ich SSH direkt im Android implementiert, nicht als App. Mein Tablet mit LineageOS hat das z. B. schon dabei, für das Doogee scheint es das nicht zu geben.

Angeblich soll es für JuiceSSH ein (kostenpflichtiges?) Tasker-Plugin, mit dem man das evt. hinbekommen könnte, hab ich aber nie nach gesucht.

pferdefreund
Beiträge: 3791
Registriert: 26.02.2009 14:35:56

Re: Script starten wenn eine Datei existiert

Beitrag von pferdefreund » 03.12.2018 09:22:10

und Userland.app inklusive Debian auf dem Telefon ist keine Alternative ? Das betreibe ich und habe da sogar, wie schon öfters erwähnt, MVS, TSO, VTAM und seit gestern auch einen Apache2-Webserver am Laufen. Von da aus hat man dann echtes SSH.
Wichtig ist nur, dass die Ports von eigenen Servern über 1024 liegen, da die anderen ja dem Android-Root reserviert sind und das Debian nur unter proot (Pseudo-Root) läuft.

Antworten