Programm beendet sich selbst / Runlevel überwachen?

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Guten Morgen ans Forum :)
    Mein erster Beitrag, natürlich gleich eine Frage.
    Bei der Suche nach Runlevel habe ich alles mögliche gefunden, aber nicht das für mich Passende.
    Mein Problem ist, dass sich mein Programm zur Messwerterfassung über serielle Schnittstelle irgendwann in der Nacht von selbst beendet. So wie es aussieht etwa eine Stunde nach dem letzten logout. Ein zweiter Raspberry zeigt die erfassten Daten über Netzwerk an, so kann ich sehen das stundenlang alles funktioniert.
    Der erste Raspberry schreibt auch stündlich in eine Logdatei, aber irgendwann ist immer wieder Schluss, keine Einträge mehr.
    Das Programm (kleines Teil in C) starte ich automatisch über init-script.

    Nachdem ich heute früh geschaut habe, mit ps -ax, läuft das Programm aber nicht mehr.
    Die Frage ist warum. Und wie kann ich es herausfinden wann/warum sich das Programm über Nacht beendet. Schläft der (das?) Raspberry irgendwann ein und killt über einem anderen Runlevel? Schmiert das Programm selber ab? (obwohl es den ganzen Tag über viele Stunden läuft)

    Irgendwelche Tips, wie ich herausfinden kann woran es liegt?

    Danke :helpnew:

  • Programm beendet sich selbst / Runlevel überwachen?? Schau mal ob du hier fündig wirst!

  • Hallo Ingolf,

    erst einmal herzlich Willkommen in unserem Forum

    Ein paar Zeilen machen mich stutzig...

    Zunächst einmal würde ich den Block restart) nach links einrücken, da es sich bei restart) wohl um eine weitere Fallunterscheidung handeln müsste, oder ;) .

    Das Skript lädt das Programm /usr/bin/strom und führt es aus. Dann macht das Skript aber nichts mehr. Erst wenn das Programm [font="Courier"]strom[/font] (ist dies Dein C-Programm?) beendet wird, ackert Dein Skript weiter. Es kommt zu seinem Ende...

    Der Knackpunkt ist sicherlich im Programm [font="Courier"]strom[/font] zu suchen. Effekte wie von Dir beschrieben, passieren häufig bei unsauberer Programmierung, wenn Speicher nicht ordentlich freigegeben wird. Irgendwann ist der halt voll - und nichts geht mehr.


    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.

  • Hallo Andreas
    Danke für deine Antwort.

    Ja, strom ist mein C-Programm. Liest über Infrarottransistor die Daten vom Easymeter-Stromzähler über serielle Schnittstelle und schreibt stündlich in ein File, sowie einmal täglich den Tagesverbrauch.
    Ich könnte auch mit einem Zettel in den Keller wackeln und aufschreiben, aber irgendwas muss man doch machen um die alten grauen Zellen in Schwingung zu halten. ;)

    Ok, die Einrückung werde ich korrigieren.
    Sind die technisch Relevant (habe gelesen, dass einige Programmiersprachen "Tab-Gesteuert" sind), oder nur optisch zur Lesbarkeit?

    Stimmt aber was du schriebst, es sind immer zwei Prozesse für strom aktiv.
    strom.jpg
    Jetzt schaue ich mal, ob nur noch ein Prozess aktiv wenn script korrigiert ist, und mein eigentliches Programm nochmal durchforsten.

    Ob es eine Möglichkeit gibt, das ich ein logfile kreiere wenn mein Prog abschmiert, dieses mir dann sagt warum? :daumendreh2:

    Einmal editiert, zuletzt von Ingolf (27. Dezember 2014 um 13:43)

  • Hallo Ingolf,

    natürlich gibt es die Möglichkeit, ein Logfile anzulegen.

    Dieses sollte folgende Daten ablegen:
    - Uhrzeit
    - aktive Prozedur inkl. Eingangs- und Ausgangsdaten
    - Prozedur-Level (spürt ggf. Probleme bei rekursiven Funktionsaufrufen auf)
    - Speicher (RAM, Freier Speicher auf Speichermedium, CPU-Usage)

    Wenn Dein Entwicklungssystem sog. Post-Mortem-Dumps erlaubt, dann wäre sowas auch sinnvoll.

    Ansonsten bin ich mir sicher, dass der Fehler im Programm [font="Courier"]strom[/font] liegt. Ginbt es irgendwelche Ereignisse, die [font="Courier"]strom[/font] beenden? Hast Du irgendwelche Grenzen eingebaut?

    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.

  • Tatsächlich läuft das script solange, bis ich strom kille.
    Das ist nicht so toll, weil ich mich somit an der Konsole gar nicht mehr anmelden kann.
    (Die login-Aufforderung erscheint gar nicht.)
    Zugang nur noch über SSH vom anderen PC.

    Frag' mich warum dieses so ist, und wie ich es ändern kann.

    Das strom-programm sollte doch im Hintergrund laufen, so wie es mit den
    init-scripten bei mysql und samba doch auch funktioniert.

    ]

    Wo ist der Fehler (ausser der vor dem Bildschirm) :helpnew:
    Oder braucht es ein "/usr/bin/strom &" ?

  • Hallo Ingolf,

    mach doch mal ein

    Code
    ... "/usr/bin/strom &"

    im Skript. Dann wirst Du feststellen, das es sofort den gleichen Status hat wie nach dem Killen von [font="Courier"]strom[/font].

    Somit ist der Nachweis erbracht, dass der Fehler in Deinem [font="Courier"]strom[/font]-Programm liegt.

    Die Frage bleibt, was bringt [font="Courier"]strom[/font] zu einem Programmende?

    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.

  • Hast Recht. Ich bin davon ausgegangen, dass dieses script das Programm startet und sich dann selbst, also das script, beendet. Ist für mich ein wenig kompliziert noch.
    Wenn es den "START-Sector" bearbeitet hat, dann gibt es doch für's script nichts mehr zu tun. :s


    Die Frage bleibt, was bringt [font="Courier"]strom[/font] zu einem Programmende?
    Beste Grüße
    Andreas

    Und gerade das ist für mich schlecht heraus zu finden.
    Weil dieses geniale ;) Programm stundenlang tut was es soll.
    Habe jetzt jeden Dateizugriff mit einer debug-meldung versehen und lasse es einfach über die Konsole von Hand laufen. Falls es kracht, sollte dann dort eine Meldung stehen.
    Habe mal den Speicher mit "free -m -t -s 2" beobachtet, dort nichts auffälliges.
    (Vermutlich solange, bis man mal nicht mehr drauf schaut)

    Gruß, Ingolf

  • Mein Problem ist, dass sich mein Programm zur Messwerterfassung über serielle Schnittstelle irgendwann in der Nacht von selbst beendet. So wie es aussieht etwa eine Stunde nach dem letzten logout.

    Ich versteh zwar nicht wieso du das Script über Runlevel bzw /etc/init.d/ laufen lässt - aber erst mal egal :fies:
    (alternativen siehe > hier <)

    Wenn sich das Programm erst eine Stunde nach deinem Logout beendet, gibts vermutlich ein Problem mit dem Programm... Was man ohne es zu kennen aber nicht genauer beantworten kann.

    Ansonsten würde ich einen Watchdog empfehlen, also ein anderes Script welches jede Minute prüft ob dein Programm läuft, falls nicht wird es gestartet... Das ginge aber auch mit deinem einen Script - wär nicht viel Aufwand.


  • Ich versteh zwar nicht wieso du das Script über Runlevel bzw /etc/init.d/ laufen lässt - aber erst mal egal :fies:

    Als Raspberry-/Linux Anfänger hatte aich nach Autostart gegoogelt und wurde darauf gestupst. Macht man so etwas generell über rc.local?


    (alternativen siehe > hier <)

    Danke für den Link. Habe es nun in /etc/rc.local eingetragen und es klappt mit dem Starten.
    Überlege noch, ob es egal ist wann das Programm startet (RS232 schon bereit?) aber egal, funktioniert. :)


    Wenn sich das Programm erst eine Stunde nach deinem Logout beendet, gibts vermutlich ein Problem mit dem Programm... Was man ohne es zu kennen aber nicht genauer beantworten kann.

    Den Code hier zu posten wäre mir jetzt peinlich, aber ihr hattet Recht:
    Ich hatte den Empfangspuffer für die seriell übertragenden Zeichen als char[200] angegeben. Normalerweise reicht das auch. Aber dann und wann kamen wohl mal mehr als drei Telegramme mit wirren Daten auf einmal.


    Ansonsten würde ich einen Watchdog empfehlen, also ein anderes Script welches jede Minute prüft ob dein Programm läuft, falls nicht wird es gestartet... Das ginge aber auch mit deinem einen Script - wär nicht viel Aufwand.

    Für mich ist das noch ein wenig zu hoch, wüsste jetzt nicht wie/wo ich da ansetzten sollte. Hört sich aber interessant an und ich würde mich freuen, wenn du ein paar Zeilen verrätst wie man so etwas bewerkstelligt.
    :danke_ATDE:

    Fazit:
    Autostart funktioniert einwandfrei. Keine Ahnung warum über Runlevel nicht.
    Programm ist die letzten Stunden nicht mehr abgeschmiert. Morgen früh mal schauen.


  • Für mich ist das noch ein wenig zu hoch, wüsste jetzt nicht wie/wo ich da ansetzten sollte. Hört sich aber interessant an und ich würde mich freuen, wenn du ein paar Zeilen verrätst wie man so etwas bewerkstelligt.

    Indem man im start) case prüft ob der Prozess bereits läuft, wenn ja nur ein echo ausgibt und falls nein wird es gestartet. Diesen case kann man dann via Crontab ständig aufrufen ;)

    Meine Watchdog Scripts sehen üblicherweise so aus:

    Für deinen Fall würden wir uns daraus nur 2-3 Zeilen abkupfern:

    In die Crontab (am besten die von root, also "sudo crontab -e") brauchst du dann nur folgendes eintragen:

    Code
    * * * * *  /etc/init.d/strom.sh start >/dev/null
  • Zitat

    Schmiert das Programm selber ab? (obwohl es den ganzen Tag über viele Stunden läuft)

    Zitat

    ... sowie einmal täglich den Tagesverbrauch.

    Da gibt es keinen Zusammenhang? Das es einmal täglich - in der "Nacht" - den Tagesverbrauch ausgibt und dann das Prg. abstürzt?

    Bevor ich das Ganze mit Watchdog/Runlevel machen würde - das Prg. muss zuverlässig laufen! Starte das ganze mal mit

    Code
    ./strom > strom.log 2>&1 &

    Log dich aus und schau dann am wenn es nicht mehr läuft das in Ruhe das Logfile strom.log an.

    PS:
    Ich hab den gleichen Zähler und mein C-Prg. heißt auch "strom" :stumm:
    Ggf. stell ich mein "strom.c" hier mal rein - oder soll ich es dir schicken?

  • Super, werde ich mal alles ausprobieren.

    Das Programm hat durchgelaufen.

    Es sind noch ein paar Fehlerhafte Einträge vorhanden, die Ursache muss ich noch finden.
    (Datum;Zeit;aktLeistung;Zaehlerstand)

    Sollte aber selbst für mich zu finden sein ;)
    Da dieses aber hier nicht das Thema war/ist, klicke ich mal auf Erledigt.

    Hallo WernerPi
    Vielen Dank für dein Angebot.
    Ich würde mir sehr gerne mal dein Programm anschauen, um zu sehen wie es richtig gemacht wird. Im Gegenzug kann ich dir ja auch mal mein Geschreibsel senden.
    (Wie macht man das hier? Über PM?)
    Für's hier Einstellen würde ich einen neuen Thread aufmachen, weil's ja nicht mehr so ganz zum Thema passt.

    Vielen Dank, auch an meigrafd und Andreas :danke_ATDE:

Jetzt mitmachen!

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