Startup Script mit respawn

  • Hallo,

    ich arbeite derzeit an einem größeren Projekt um mit dem Raspberry einige IO Port zu schalten wenn ich über ein paar Analog to Digitalwandler einen bestimmten Wert erhalte.

    Jetzt habe ich unter init.d ein Bash Script liegen welches mir ein php Script startet (php /Pfad zum Script.php)

    Das php Script enthält eine Endlosschleife und fragt alle paar Sekunden die Werte ab und reagiert darauf.

    Nun habe ich aber das Problem wenn das Script einen Fehler produziert, es nicht mehr läuft.

    Wie kann ich nun eine Art Service starten mit der Eigenschaft zum respawnen?
    [/align]
    Ich habe schon etwas zu start-stop-daemon gelesen, dieser kann aber nicht respawn wenn ich richtig bin?

    Gibt es eventuell noch andere Möglichkeiten die ich übersehen habe?

    Vielen Dank
    Harry

  • Jetzt habe ich unter init.d ein Bash Script liegen welches mir ein php Script startet (php /Pfad zum Script.php)

    Es ist eher ungewöhnlich ein normales/solches Script als Service in /etc/init.d/ einzubinden. Lies dir dazu mal folgendes durch: Automatisches Starten von Scripte / Programme ( Autostart )


    Nun habe ich aber das Problem wenn das Script einen Fehler produziert, es nicht mehr läuft.

    Bitte Script posten
    (in PHP oder CODE)

    Wie kann ich nun eine Art Service starten mit der Eigenschaft zum respawnen?

    Mithilfe eines watchdog Scripts, welches regelmäßig über Crontab ausgeführt wird und prüft ob der Prozess des Scripts noch läuft -> falls nicht neu starten.

  • Hallo und danke für deine Antwort.

    Mit Bash Script habe ich mich etwas "verschrieben".

    Mein Script sieht aktuell so aus.

    Mein php Script hat aktuell weit über 500 Zeilen wenn ich alle Klassen usw. hinzuzähle die darin verwendet werden.

    Ich habe schon soviel wie möglich Error Handling eingebaut um alle Fehler abzufangen, aber man kann ja nie wissen was schief geht... :)

    Crontab ist mir auch schon eingefallen, hab das aber für nicht richtig gehalten..?

    Hatte da eher an einen Service gedacht, war das falsch?

    Also am besten das init Script komplett entfernen und anstelle diesem ein Bash Script dass alle 5 Minuten läuft und nachschaut ob mein php Script noch läuft?

    Einmal editiert, zuletzt von Harry89 (10. Dezember 2014 um 17:09)

  • Ohne mich da jetzt großasrtig reingelesen zu haben:
    Gängige Praxis ist, dass ein Prozess seine pid in z.B. /var/lock ablegt und ein weiterer, als daemon im Hintergrund gestarteter, zyklisch per kill() nachschaut, ob dieser Prozess noch läuft und ggf. per fork()/exec() einen neuen startet.
    Jedenfalls habe ich das immer so gemacht ...
    cu,
    -ds-

  • Crontab ist mir auch schon eingefallen, hab das aber für nicht richtig gehalten..?

    Warum?
    crontab kann nicht nur "zeitintervalle ausführungen" sondern hat auch sowas wie @reboot ;)

    Also am besten das init Script komplett entfernen und anstelle diesem ein Bash Script dass alle 5 Minuten läuft und nachschaut ob mein php Script noch läuft?

    Naja komplett entfernen nicht unbedingt, ich würds erst mal aus dem Runlevel wieder rausnehmen und stattdessen in einer der Automatisches Starten von Scripte / Programme ( Autostart ) Möglichkeiten eintragen

    Also zunächst brauchst du eine Methode um es bei Systemstart zu starten. Über die Benutzercrontab würde sich dann also @reboot anbieten, oder /etc/rc.local , oder /etc/crontab

    Und dann brauchst du noch ein crontab Eintrag welcher regelmäßig prüft ob der Prozess noch läuft. Das hast du ja sozusagen bereits in deinem Script eingebaut, indem du " start " ausführst wird ja erst geprüft ob der Prozess bereits läuft. Also trägst du einfach sowas wie

    Code
    * * * * * /bin/bash /etc/init.d/ServiceScript.sh start >/dev/null 2>&1

    in eine crontab ein...

    Jenachdem wofür du dich für den "Systemstart" entscheidest, könnten dann halt 2 Einträge vorhanden sein... Dann wär alles an einer Stelle :)

    Aber du hast im restart) noch einen kleinen Fehler, zwischen stopprogram und startprogram solltest du noch ein sleep 2 (oder etwas höher) einbauen damit das nicht zu schnell ausgeführt wird, es kommt nämlich manchmal vor dass das beenden etwas länger dauert als der befehl der es auslöst :fies:


    dreamshader: Ja, so wäre es professionell und ist das was ein Watchdog wäre :)


  • ..daemon im Hintergrund gestarteter, zyklisch per kill() nachschaut, ob dieser Prozess noch läuft und ggf. per fork()/exec() einen neuen startet.

    Um diese Idee einmal aufzugreifen..

    Ich könnte also zb. über crontab -e mein ServiceScript mit @reboot starten und im ServiceScript mit start-stop-daemon einen Dämon einrichten der mir kontrolliert ob mein ServiceScript noch läuft und es bei Bedarf wieder anfahren?

  • Super vielen Dank.

    Ich habe nun die Methode mit den 2 Einträgen in der Crontab -e eingestellt.

    Einmal mit @reboot und einmal mit einem Zeitintervall von 1 Minute.

    Funktioniert bestens. :)
    Und ein sleep von 5 habe ich noch eingebaut.

    Vielen Dank für eure Hilfe. :)

Jetzt mitmachen!

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