Log Datei auswerten, mit bash script oder Befehlsfolge

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo zusammen,

    Ich arbeite gerade an einer Aufgabe und komme damit leider nicht weiter...

    Habe ein Script bekommen, dass mir in eine Log-Datei alle 10 Sekunden ein Zeichen, 0 oder 1, in diese Datei überschreibt.

    Ich bräuchte nun ein weiteres bash Script, oder eine Befehlsfolge (Pipe, ist das richtig?)

    das mir alle 30 Sekunden diese Log-Datei ausliest und folgend auswertet:

    - Ist der Inhalt der Log-Datei 0, dann Befehl A ausführen. (z.B. shutdown)

    - Ist der Inhalt der Log-Datei 1, dann Befehl B ausführen. (z.B. reboot)

    Bin eher auf der Hardwareseite Zuhause und tue mich mit der Programmierung noch schwer.

    Könnt ihr mir helfen?

    Vielen Dank an alle, vorab.

    D / NRW / DO

  • Log Datei auswerten, mit bash script oder Befehlsfolge? Schau mal ob du hier fündig wirst!

  • Hallo Iv256,

    ich würde es über named pipes (= FIFO-Dateien) machen. Wie das bzgl. der Programmiersprache Icon funktioniert, erschließt sich Dir nach einer Suche hier im Forum.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • wird _fortlaufend_ in die Logdatei geschrieben oder ist da immer nur ein Zeichen drin?

    Habe ein Script bekommen, dass mir in eine Log-Datei alle 10 Sekunden ein Zeichen, 0 oder 1, in diese Datei überschreibt.

    Dann würde ich es eher in den RAM auslagern, statt alle 10 Sek. auf die Micro-SD (?) zu schreiben.

  • Hallo noisefloor,

    Hallo,

    wird _fortlaufend_ in die Logdatei geschrieben oder ist da immer nur ein Zeichen drin?

    Andreas: warum würdest du einen eine named pipe benutzen? Ein einfaches Lesen der Logdatei reicht doch auch...

    Gruß, noisefloor

    schau mal hier rein...Dann sollte klar werden, warum mir named pipes so gut gefallen. Bei den meisten anderen Konzepten hast Du natürlich auch einen Austausch von Daten / Kommandos. Die Rückmeldung, dass "verstanden" und "erfolgreich ausgeführt" wurde, fehlt oder musst Du selber erzeugen. Diese Rückmeldung entfällt bei named pipes - sie sind nach dem Auslesen leer. Der "Befüller" der named pipe weiß also, dass "Datei leer" mit "darf wieder was befüllen" bedeutet. Umgekehrt verbietet sich ein "Befüllen", wenn die Datei nicht leer ist.

    Da steckt also ganz viel mehr drin, als es der simple Begriff named pipe vermuten ließe. Und mit diesem simplen aber wirkungsvollen Konzept wird auch ohne weitere Programmierung erreicht, dass nichts verloren geht (sollte es darauf ankommen).

    Wie gesagt, schaue mal in meinen Link rein... warte mal bis 14:00 (ich formatiere da noch bisschen dran rum - wegen der neuen Forensoftware).

    ... 14:00 FERTSCH!


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    2 Mal editiert, zuletzt von Andreas (23. Dezember 2017 um 14:00)

  • Folgender bash Code lauscht auf jeder Schreiboperation in die Datei inot.txt und initiiert eine Aktion abhaengig vom Inhalt der in die Datei geschrieben wurde. Um shutdown und reboot zu aktivieren muss nur der # entfernt werden ;)

  • Warum muss es denn Bash sein, oder geht auch Python, oder eine andere Sprache ?

    Ich fange ja gerade erst an mich mit Linux und dem Thema "Programmierung" auseinanderzusetzten. Und da die bash eine Menge Werzeuge mitbringt, dachte ich mir, übe damit zuerst. Weil die bash immer wieder zu gebauchen ist und sich für einfache Aufgaben gut in Scipten einsetzen lässt.

    Ich vermute, für anspruchsvolle Aufgabe wird Python wesentlich efektiver sein und auch schneller sein. Python kommt später mit Sicherheit noch auf mich zu, weil sich mit den Erfolg auch die Motivation steigert sich tiefer mit dem Thema zu beschäftigen. :cool:

    D / NRW / DO

  • Folgender bash Code lauscht auf jeder Schreiboperation in die Datei inot.txt und initiiert eine Aktion abhaengig vom Inhalt der in die Datei geschrieben wurde. Um shutdown und reboot zu aktivieren muss nur der # entfernt werden ;)

    Hallo framp,

    vielen Dank für Deine Hilsbereitschaft, werde ich gleich direkt ausprobieren.

    mit weihnachtlichen Grüßen

    D / NRW / DO

  • Also alle 30 Sekunden ein Reboot oder Shutdown?

    Hallo Tell,

    shutdown und reboot sollten hier nur zum Verständnis als Beispiel dienen,

    auch wenn diese 2 Befehle in diesem Zusammenhang nicht wirklich logisch sind.

    Kurz zum Hintergrund...

    Es wird mit einem LDR (Lichtabhängiger Widerstand) in einer Schaltung ein GPIO mit "gpio read x" abgefragt, der Wert in die temporäre Log-Datei im Verzeichnis /tmp geschrieben bzw. überschrieben. Abhängig von diesem Wert, 0 oder 1, sollte dann entsprechder Befehl gestartet werden.

    mit weihnachtlichen Grüßen.

    D / NRW / DO

  • Es wird mit einem LDR (Lichtabhängiger Widerstand) in einer Schaltung ein GPIO mit "gpio read x" abgefragt, der Wert in die temporäre Log-Datei im Verzeichnis /tmp geschrieben bzw. überschrieben. Abhängig von diesem Wert, 0 oder 1, sollte dann entsprechder Befehl gestartet werden.

    Da würde es sich eher anbieten sofort zu reagieren und/oder nicht einen Umweg über eine normale Textdatei zu gehen.

    Du scheinst ja bereits ein Script zum auslesen des GPIO's zu haben - warum integrierst du da nicht direkt die 'aktion' mit rein?

    Alternativ würde sich das direkte ansprechen des "aktion"-Scripts anbieten. Oder wirklich eine FIFO-Datei verwenden, oder ein Socket...

    /tmp/ ist nicht automatisch / per default tmpfs, das muss man soweit ich weiß erst explizit aktivieren.


    PS: ständiges polling über "gpio read x" ist nicht wirklich effektiv. Besser wäre eine auf Interrupt basierende Lösung...

  • Hallo meigrafd

    Das hört sich ja genial an, doch wie setzt man das um oder wie würdest Du es machen, wenn ich fragen darf?

    Ich habe mit meinen sehr bescheidenen Kenntnissen dieses Scipt zur Erstellung der Log-Datei beholfen.

    In der /etc/fstab habe ich /tmp als tmpfs deklariert.

    Aber bitte nicht auslachen ... :no_sad:

    Spoiler anzeigen

    # Das Script fragt den Pegel am GPIO 6 ab, an dem ein LDR (Lichtempfindlicher Widerstand) angeschlossen ist.

    # Lichtstärke gering = Pegel 1 (High)

    # Lichtstätke hoch = Pegel 0 (Low)

    # Zusätlich wird eine LED zur Kontrolle geschaltet (GPIO 3) und zeigt den Zustand an.

    #

    #!/bin/sh

    LOGFILE="/tmp/ldr.log"

    touch $LOGFILE

    gpio mode 6 in

    gpio mode 3 out

    gpio write 3 0

    while true

    do

    result="$( gpio read 6 )"

    if [ "$result" = "1" ]; then

    gpio write 3 1

    echo "Kontrolle der Helligkeit... gering"

    gpio read 3 > $LOGFILE

    echo "Kontroll LED an"

    fi

    if [ "$result" = "0" ]; then

    gpio write 3 0

    echo "Kontrolle der Helligkeit... hoch"

    gpio mode 3 out

    gpio read 3 > $LOGFILE

    echo "Kontroll LED aus"

    fi

    sleep 10

    done

    mit weihnachtlichen Grüßen

    D / NRW / DO

  • Nun, deine Vorgehensweise fördert direkt weitere Probleme: Du benötigst ein zusätzliches Script zum auslesen der Textdatei um darauf dann zu reagieren...

    Zusätzlich bremst du das Script aus indem du erst GPIO#3 auf High setzt und dann dessen Status ausließt und in die Textdatei umleitest...

    Das "sleep 10" am Ende kann ebenfalls dazu führen dass du Flankenwechsel verpasst, es sei denn es handelt sich um Schalter und nicht Taster, die wirklich für mindestens 10 Sekunden betötigt bleiben - sprich, dein LDR muss für mind. 10 Sekunden den Pegel halten sonst reagiert dein Script nicht.

    Also zunächst darüber nachdenken: wieso unbedingt bash Scripts :conf:

    Weitaus einfacher und effektier wäre es nämlich wenn Python statt bash genutzt werden würde. Hast du dich mit Python schon mal beschäftigt?

  • Nun, deine Vorgehensweise fördert direkt weitere Probleme: Du benötigst ein zusätzliches Script zum auslesen der Textdatei um darauf dann zu reagieren...

    Zusätzlich bremst du das Script aus indem du erst GPIO#3 auf High setzt und dann dessen Status ausließt und in die Textdatei umleitest...

    Das "sleep 10" am Ende kann ebenfalls dazu führen dass du Flankenwechsel verpasst, es sei denn es handelt sich um Schalter und nicht Taster, die wirklich für mindestens 10 Sekunden betötigt bleiben - sprich, dein LDR muss für mind. 10 Sekunden den Pegel halten sonst reagiert dein Script nicht.

    Also zunächst darüber nachdenken: wieso unbedingt bash Scripts :conf:

    Weitaus einfacher und effektier wäre es nämlich wenn Python statt bash genutzt werden würde. Hast du dich mit Python schon mal beschäftigt?

    Ja, ist schon irre was alles mit berücksichtigt werden sollte. :conf:

    Zu Python: Nein, hatte ich im Post #12 etwas dazu geschrieben...

    Was macht Dein "Klingel-Projekt", abgeschlossen und zufrieden?

    D / NRW / DO

  • Ungetestet:

  • Folgender bash Code lauscht auf jeder Schreiboperation in die Datei inot.txt und initiiert eine Aktion abhaengig vom Inhalt der in die Datei geschrieben wurde. Um shutdown und reboot zu aktivieren muss nur der # entfernt werden ;)

    Hallo framp,

    mein Script läuft und es wird munter in die /tmp/ldr.log überschrieben...

    Habe die inotify-tools installiert... /usr/bin/inotifywait und /usr/bin/inotifywait sind vorhanden und beide Dateien sind ausführbar.

    Im Script die Änderung der Variable $LOGFILE auf /tmp/ldr.log geändert. File /tmp/ldr.log ist vorhanden.

    Beim Start Deines Scripts kommt dennoch die folgende Meldung hoch:

    Install package inotify-tools (sudo apt-get install inotify-tools)

    Egal ob ich als user pi oder mit sudo aufrufe

    Was mache ich falsch?

    D / NRW / DO

Jetzt mitmachen!

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