rc.local ssh und Bildschirmausgabe

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Ich habe eine kleine C Anwendung geschrieben die Messdaten jede Stunde in einer Log Datei ablegt.
    Gleichzeitig gibt es Akuelle Messdaten im Abstand von 10 sec. auf dem Bildschirm aus.
    Die Anwendung starte ich in der rc.local
    Mit Samba lese ich die Log Datei aus.

    Wie kann ich aber die aktuellen Messdaten über SSH auf den Monitor bringen.
    (es ist kein Monitor am Raspi angeschlossen)
    Ich hoffe dieses Thema ist am richtigen Ort, ansonsten Mod bitte melden.
    Jetzt schon ein DANKE an jedem der hilft :danke_ATDE:

    Einmal editiert, zuletzt von ich_probiers (8. November 2014 um 20:13)

  • Hi,


    Ich habe eine kleine C Anwendung geschrieben die Messdaten jede Stunde in einer Log Datei ablegt.
    Gleichzeitig gibt es Akuelle Messdaten im Abstand von 10 sec. auf dem Bildschirm aus.
    Die Anwendung starte ich in der rc.local
    Mit Samba lese ich die Log Datei aus.


    Wenn du das Programm über die rc.local startest macht es doch eigentlich keinen Sinn wenn es die akutellen Messdaten alle 10 Sekunden auf dem Bildschirm aus gibt, da du die Ausgabe ja sowieso nicht siehst. Oder? :huh:



    Wie kann ich aber die aktuellen Messdaten über SSH auf den Monitor bringen.
    (es ist kein Monitor am Raspi angeschlossen)


    Wie meinst du das genau? :huh:

    Du loggst dich per SSH auf dem Raspi ein und lässt dir z.B. mit folgendem Befehl den aktuellen Inhalt der Logdatei anzeigen.

    Code
    cat /pfad/zur/logdatei

    DON'T PANIC!

    Einmal editiert, zuletzt von joh.raspi (9. November 2014 um 08:35)

  • Wenn du das Programm über die rc.local startest macht es doch eigentlich keinen Sinn wenn es die akutellen Messdaten alle 10 Sekunden auf dem Bildschirm aus gibt, da du die Ausgabe ja sowieso nicht siehst. Oder?

    Genau das ist das Problem :bravo2:

    Ich möchte aber manchmal die aktuellen Messdaten über SSH sehen können, wenn ich die Anwendung dann über SSH starte so leuft die Anwendung 2 mal und es kann Messabweichungen geben.

    Einmal editiert, zuletzt von ich_probiers (9. November 2014 um 10:04)

  • Lass die Ausgabe nicht auf den Bildschim schreiben sondern in eine Datei.

    Dann per ssh auf den PI und dort ein

    Code
    tail -f /pfad/zur/datei

    Offizieller Schmier und Schmutzfink des Forum.
    Warum einfach wenn's auch schwer geht ?

    Kein Support per PN !
    Fragen bitte hier im Forum stellen. So hat jeder etwas davon.

  • Theoretisch Ok
    jede messung ist ein längerer Datensatz die Anwendung lauft 24h das ganze Jahr.
    Ich habe angst die SD Karte zu überfordern.
    Sollte es nicht von Linux aus eine Möglichkeit geben die Anwendung so zu starten dass wenn ich mich mit SSH verbinde ich die (printf im Programm) direkt sehe?

    Einmal editiert, zuletzt von ich_probiers (9. November 2014 um 11:19)

  • Ich glaube du missverstehst da etwas.

    Wenn du dich über SSH anmeldest und das fragliche Programm ausführst, siehst du auch dessen Ausgaben.
    Wenn du das Programm aber über /etc/rc.local , oder einen anderen "Autostart"-Weg ausführst, ist die tty Konsole eine andere, nicht die die du über SSH zugeteilt kriegst.

    Spoiler anzeigen


    Jenachdem wie dein Programm aufgebaut ist - wenn du print Zeilen drin hast, kannst du dessen Ausgabe in eine Datei umleiten lassen. Beispielsweise könnte der Eintrag in /etc/rc.local wie folgt aussehen:

    Code
    /path/to/binary > /path/to/logfile

    Das einfache > ist eine Umleitung. Würdest du rebooten würde der bisherige Inhalt von /path/to/logfile gelöscht und der Dateizeiger auf den Anfang der Datei gesetzt und ab da wieder die Ausgabe rein geschrieben werden. Solange das Programm läuft kommt jede Zeile untereinander.... Das sollte denk ich soweit klar sein.

    Nun könnte man noch etwas weiter ausholen:

    In Linux gibt es sog. Ausgabeleitungen welche über sog. Kanälen geregelt werden.
    stdout ist Kanal 1
    stderr ist Kanal 2

    Die Standard Ausgabe, welche du über print oder echo Zeilen ausgeben lässt ist also stdout.
    Fehlermeldungen die du nicht explizit selber ausgibst, werden über stderr ausgegeben.

    Bei einer Umleitung in eine Datei könnte man nun noch daher gehen und den 1.Kanal auf den 2. umleiten um alles in einer Datei zu haben. Dazu fügt man nach der eigentlichen Umleitung noch folgendes ein:

    Code
    2>&1

    Siehe dazu auch: http://wiki.ubuntuusers.de/Shell/Umleitungen


    Was du nun aber schon angesprochen hast ist die mögliche Überlastung der SD durch ständiges schreiben, denn eine SD verträgt bekanntlich nicht unendlich viele Schreibzyklen.
    Aber auch hierfür gäbe es Möglichkeiten wie zum Beispiel den Ordner in dem die Logdatei liegt in den RAM auszulagern also ein sog. tmpfs . Dabei wird nur soviel RAM verwenden wie tatsächlich Platz belegt/benötigt wird - im Gegensatz zu ramfs welches zB 10MB RAM verwendet obwohl die Datei nur 500kB gross ist...

    Damit verbunden ergibt sich aber ein weiteres Problem:
    Soll die Messung über einen längeren Zeitraum laufen, wird also auch die Logdatei immer größer. Der PI hat aber nicht allzuviel RAM. Würde man die Größe des tmpfs auf zB 100MB begrenzen und dieses Limit erreicht werden, wird auch nichts mehr in die Logdatei geschrieben..
    Eine Abhilfe hierzu wäre die Größe der Logdatei regelmäßig über crontab zu prüfen und beim erreichen eines bestimmten Limits diese zu leeren.

    Es gibt aber wie immer, mehrere Möglichkeiten etwas zu lösen :D


    Du könntest zum Beispiel auch das Programm in einem screen ausführen. Dann kannst du dich in diesen Screen bei Bedarf einklinken (attachen) und siehst dann auch die Ausgaben. Da gäbe es dann auch keine Zusätzliche Belastung für die SD ;)
    ...wäre die vermutlich einfachste und eleganteste Möglichkeit...

  • So jetzt kommt die Familie wieder zu kurz !!!!
    Das mit dem screen ist warscheinlich genau das was ich suche du hast mein Problem erkannt dank. ich werde es Heute noch versuchen und bescheid geben ob mein Problem gelöst ist.

    :bravo2: DANKE :bravo2::bravo2:

  • Na ja, wenn das File im RAM liegt belastet es auch die SD nicht.
    Aber Screen ist auch eine gute Lösung.

    Offizieller Schmier und Schmutzfink des Forum.
    Warum einfach wenn's auch schwer geht ?

    Kein Support per PN !
    Fragen bitte hier im Forum stellen. So hat jeder etwas davon.

  • Du könntest aber auch einfach deine Anwenung um eine Art Debugging Modus erweitern. Also die Anwendung so umprogrammieren dass es möglich wird das Programm auf zwei verschiedene Arten ausführen zu lassen. Dazu musst du nur deiner Anwendung beibringen "Parameter" zu verstehen.

    Beispiel:
    1. Startest du das Programm ohne Parameter, verhällt es sich wie bisher und schreibt jede Stunde die Daten in die Logdatei, die printf's werden dabei aber ignoriert.
    2. Startest du das Programm aber z.B. mit dem Parameter "-d"(was für "debug" stehen könnte), bekommst du alle 10 Sekunden die Werte mittels printf auf dem Bildschirm angezeigt, in die Logdatei wird dabei aber wiederum nichts geschrieben.


    Na ja, wenn das File im RAM liegt belastet es auch die SD nicht.


    Also einfach im Verzeichnis /tmp ablegen oder?

    Joh

    DON'T PANIC!


  • Also einfach im Verzeichnis /tmp ablegen oder?

    Beachtet dazu den unteren Teil in meinem Spoiler. Da muss man auch etwas zu beachten..

    /tmp/ ist nicht immer automatisch tmpfs, das muss man oft erst über /etc/default/tmpfs enablen

  • Oh, Danke! Hatte den Spoiler nur kurz überflogen, hat auf den ersten Blick so ausgesehen also ob du dich nur etwas über Umleitungen "auslässt". :^^:


    Eine Abhilfe hierzu wäre die Größe der Logdatei regelmäßig über crontab zu prüfen und beim erreichen eines bestimmten Limits diese zu leeren.


    Wieso nicht mittels "logrotate" archivieren. Wäre das nicht besser? Oder overkill?

    Grüße,
    Joh

    DON'T PANIC!

  • Wieso nicht mittels "logrotate" archivieren. Wäre das nicht besser? Oder overkill?

    Über logrotate wird normalerweise die Datei umbenannt bzw verschoben, eine neue/frische Datei erzeugt und anschließend der Dienst neu gestartet - viele Programme mögen es nämlich nicht wenn ihnen "einfach so unterm Hintern" die Datei in der sie schreiben weggenommen wird..

    Man kann das zwar auch alles einstellen usw aber "das" wäre vermutlich overkill, sich dafür extra da rein zu fuchsen :D

    Es würde i.d.R. reichen einfach ein echo "" > /path/to/logfile auszuführen um den Inhalt der Datei zu leeren/löschen, aber die Datei Ansich weiter bestehen bliebe

    Für sowas hab ich mir ein kleines Bash Script geschrieben, beziehungsweise in Scripts mit eingebaut bei denen öfters was in ein Logfile geschrieben wurde:

    Ein Script (was über crontab regelmäsig ausgeführt wird oder permanent läuft) prüft vor dem schreiben ins Logfile wie gross das Logfile ist und beim erreichen eines Grenzwerts gelöscht oder rotiert.
    So hat man dann alles in einem Script, ohne hier und dort noch zusätzlich was einrichten zu müssen, was man in 5 Jahren aber ggf schon längst wieder vergessen hat (wie/was/wo) :fies:

    Beispiel Script:

Jetzt mitmachen!

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