Prozess/Anwendung überwachen

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Guten Morgen liebe Community!

    Heute wende ich mich mal mit einem ersten Problem an euch. Leider hat die Suche hier im Forum kein Ergebis gebracht, sodass ich diesen Thread eröffnen muss.

    Auf meinem Raspberry Pi habe ich "inadyn" installiert, was bisher auch soweit funktioniert. Einmal hat der Prozess sich jedoch leider aufgehängt und sich beendet (warum auch immer?). Besteht die Möglichkeit, beispielsweise via Crontab alle 30 Minuten zu prüfen, ob der Prozess "inadyn" noch läuft und wenn nicht, dass dieser dann automatisch gestartet wird?
    Leider lässt sich der Prozess mehrfach starten (ich weiss nicht ob das unter Linux generell der Fall ist - bei manche Windows-Anwendungen klappt das ja nicht), sodass man diesen nicht einfach alle 30 Minuten ausführen kann, denn dann hätte man nach ein paar Tagen gleich hunderte davon aktiv und das wäre ja Unsinn. ;)


    Gruß, Wilfried

  • So als Denkanstoß, einfach dahingeschmiert ohne Anspruch auf Funktion :

    Bash
    #!/bin/sh
    APP=ps -a | grep inadyn
    if [ -z $APP ];then
      /etc/init.d/inadyn start
    fi

    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.


  • Leider lässt sich der Prozess mehrfach starten (ich weiss nicht ob das unter Linux generell der Fall ist - bei manche Windows-Anwendungen klappt das ja nicht), sodass man diesen nicht einfach alle 30 Minuten ausführen kann, denn dann hätte man nach ein paar Tagen gleich hunderte davon aktiv und das wäre ja Unsinn.

    Normalerweise erzeugt das /etc/init.d/inadyn Script ein pidfile wodurch unterbunden wird das man es mehrfach starten kann: --pidfile /var/run/inadyn.pid
    Aber eben nur wenn man es über das /etc/init.d/inadyn Script ausführen will..
    Ansonsten muss man im Script eben einbauen das die Prozess-Liste (ps) vorher nach dem Namen des Prozesses abgesucht wird und nur wenn der dort nicht gefunden werden kann wird der Prozess erneut gestartet...


    Auf meinem Raspberry Pi habe ich "inadyn" installiert, was bisher auch soweit funktioniert. Einmal hat der Prozess sich jedoch leider aufgehängt und sich beendet (warum auch immer?). Besteht die Möglichkeit, beispielsweise via Crontab alle 30 Minuten zu prüfen, ob der Prozess "inadyn" noch läuft und wenn nicht, dass dieser dann automatisch gestartet wird?

    Solche Prozess-Überwachungs Scripte nennen sich übrigends watchdog ;)

    Sowas wie Der_Imperator gepostet hat ist schon fast richtig, nur 2 kleine Fehler:

    Code
    APP=ps -a | grep inadyn

    Das wird so nicht funktionieren und müsste stattdessen so aussehen:

    Code
    APP=`ps -a | grep inadyn`

    oder meine bevorzugte Schreibweise:

    Code
    APP=$(ps -a | grep inadyn)

    Desweiteren würde das "grep" sich selber finden und somit wär die Variable APP immer "voll"...
    Und dann war auch noch das 'ps -a' falsch, wenn dann ohne Bindestrich also 'ps a' , aber das zeigt nur die Prozesse des aktuellen Benutzers, nicht die globalen
    Also müsste das korrekt so aussehen:

    Code
    APP=`ps aux | grep -v grep | grep inadyn`

    oder meine bevorzugte Schreibweise:

    Code
    APP=$(ps aux | grep -v grep | grep inadyn)

    grep versucht ein vorkommen zu finden und -v ignoriert "grep"


    Meine wachtdogs sehen üblicherweise so aus:

    Das dann entsprechtend in die Crontab von root eintragen: crontab -e

    Code
    * * * * *    bash /path/to/watchdog.sh >/dev/null 2>&1


    Mehr zur crontab kannst du hier nachlesen: https://www.forum-raspberrypi.de/Thread-tutorial-crontab-cron-jobs

  • Vielen Dank für eure Antworten! Leider funktioniert es aber noch nicht so wie gewünscht...

    Mein Skript sieht nun so aus:

    Bash
    #!/bin/sh
    APP=$(ps -a | grep inadyn)
    if [ ! -z $APP ];then
      echo "$APP lauft"
    else
      echo "wird gestartet"
      sudo /usr/sbin/inadyn
    fi

    Wenn ich das Skript nun ausführe, wird der Prozess auch gestartet, wenn er bereits aktiv ist.


    meigrafd:
    Unter /var/run befindet sich kein pidfile namens "inadyn.pid"...


  • Vielen Dank für eure Antworten! Leider funktioniert es aber noch nicht so wie gewünscht...

    Mein Skript sieht nun so aus:

    Bash
    #!/bin/sh
    APP=$(ps -a | grep inadyn)
    if [ ! -z $APP ];then
      echo "$APP lauft"
    else
      echo "wird gestartet"
      sudo /usr/sbin/inadyn
    fi

    Wenn ich das Skript nun ausführe, wird der Prozess auch gestartet, wenn er bereits aktiv ist.

    Prüf das halt mal manuell, was kommt wenn du ps -a | grep inadny ausführst?
    Wenn da was kommt wäre also $APP auch nicht leer


    Der ps Befehl ist falsch..
    ' ps -a ' zeigt was anderes als ' ps a ' , aber da du anscheint das Script als "pi" Benutzer ausführst (deswegen vermutlich das sudo), wirst du den Prozess mit ' ps a ' nicht finden können da das nur Prozesse des aktuellen Benutzers anzeigen würde, aber der Prozess durch das sudo als root läuft, also müsstest du dir alle Prozesse anzeigen lassen und das geht über ' ps ax '


    learning by doing - die Lösung findest du oben in meinem Post ;)



    meigrafd:
    Unter /var/run befindet sich kein pidfile namens "inadyn.pid"...

    Das liegt daran weil du die Binary manuell ausführst aber nicht, wie bereits in dem Satz mit /var/run/ erwähnt, das /etc/init.d/inadyn script nutzt

  • Wenn ich in der Shell "ps -a | grep inadyn" ausführe, passiert im Prinzip nichts. Der zeigt nichts an, meckert aber auch nicht...

    Code
    pi@raspberry ~ $ ps -a | grep inadyn
    pi@raspberry ~ $

    Ich habe zweimal geprüft, einmal während der Prozess läuft und einmal während der nicht läuft - das Ergebnis ist gleich.


    Bei mir gibt es unter /etc/init.d kein "inadyn"-Skript.

  • dreamshader: das is aber dirty ;)


    Ich hab die Lösung oben in meinem ersten Beitrag in diesem Thema stehen

    Wie gesagt, learning by doing :)


    Nochmal zum mitdenken:

    Wenn man nur

    Code
    ps -a


    in der Konsole eingibt, kommt nur das als Ausgabe:

    Code
    root@raspberry-pi:~# ps -a
      PID TTY          TIME CMD
     1697 pts/0    00:00:00 ps
    root@raspberry-pi:~#

    Nun frag dich mal wie "grep" in dieser Ausgabe etwas finden soll?
    Das kann also nicht funktionieren...

    Wenn man stattdessen aber

    Code
    ps a

    in der Konsole eingibt, kriegt man folgende Ausgabe:

    Da könnte grep also schon mal was finden... Aber trotzdem ist diese Ausgabe hier nicht zu gebrauchen da das nur Prozesse des aktuell verwendeten Benutzer anzeigt...
    Du hast in deinem Script aber "sudo" drin stehen, also führst du dein Script über einen anderen Benutzer aus als letzlich 'inadyn' laufen würde... sudo sorgt dafür das der Befehl als root ausgeführt wird
    Um also über 'ps' auch Prozesse anderer Benutzer anzuzeigen, in der dann grep nach etwas suchen kann, muss man den Befehl erweitern und zumindest

    Code
    ps ax

    daraus machen....
    Dann sähe die Ausgabe ungefähr so aus:


    Da kann grep dann auch wesendlich schneller was finden, also zum Beispiel

    Code
    ps ax | grep rsyslogd

    gibt dann das aus:

    Code
    root@raspberry-pi:~# ps ax | grep rsyslogd
     1487 ?        Sl     0:00 /usr/sbin/rsyslogd -c5
     1715 pts/0    S+     0:00 grep rsyslogd
    root@raspberry-pi:~#

    Da sieht man dann aber auch dass der grep sich selber auflistet da das ja auf das Suchmuster zutrifft... Wenn man also das in eine Variable schreiben würde, der Prozess selber aber nicht laufen würde, wäre die Variable trotzdem immer befüllt...
    Um das wiederum zu unterbinden muss man grep sagen das es den "grep" in der Auslistung ignorieren soll:

    Code
    ps ax | grep -v grep | grep rsyslogd

    ...die Ausgabe wäre dann:

    Code
    root@raspberry-pi:~# ps ax | grep -v grep | grep rsyslogd
     1487 ?        Sl     0:00 /usr/sbin/rsyslogd -c5
    root@raspberry-pi:~#


    Jetzt verstanden? :huh:


    PS: ich nutze in der konsole immer ps aux

  • Vielen Dank für die hilfreiche Antwort! Nun funktioniert es, auch wenn ich eine Ausgabe in der Shell etwas verwirrend finde... :)

    Zunächst mal mein Skript:


    Wenn nun der Prozess nicht aktiv ist und ich das Skript ausführe kommt folgendes, was für mich auch nachvollziehbar ist.

    Code
    pi@raspberry ~ $ sh watchdog.sh
    iandyn wird gestartet
    pi@raspberry ~ $


    Wenn der Prozess aktiv ist und ich das Skript ausführe, kommt diese - für mich verwirrende - Ausgabe.

    Code
    pi@raspberry ~ $ sh watchdog.sh
    watchdog.sh: 5: watchdog.sh: [root      6816  0.0  0.1   1912   708 ?        Ss   13:18   0:00 inadyn: not found
    inadyn ist aktiv
    pi@raspberry ~ $


    1. Warum spuckt der hier überhaupt die erste Zeile aus? Im Skript lasse ich ja nur das aus der zweiten Zeile ausgeben.
    2. Warum steht am Ende der ersten Zeile "not found"?


    Sorry, wenn ich so viele Fragen stelle... Ich kenne mich mit Linux nicht aus und muss somit noch eine Menge dazu lernen. ;)


    Gruß, Wilfried

  • watchdog.sh: 5:

    Sagt aus das in Zeile 5 ein Fehler aufgetreten is und das is deine if Schleife

    Deine if Schleife hat die falsche Syntax - da fehlen Leerzeichen

    Falsch:

    Code
    if ["$APP" == ""];

    Richtig:

    Code
    if [ "$APP" == "" ];

    Desweiteren würd ich lieber " -z " benutzen, was soviel bewirkt wie: wenn Variable leer oder nicht vorhanden
    Also:

    Code
    if [ -z "$APP" ];


    Eine negation " ! " würde dann bedeuten: wenn NICHT leer
    Dafür gäbe es aber auch " -n " was also das selbe wäre wie " ! -z "
    Also:

    Code
    if [ ! -z "$APP" ];

    Oder:

    Code
    if [ -n "$APP" ];
  • Danke für deine Antwort. Nachdem ich die Leerzeichen eingefügt hatte, kam auch weiterhin diese eine Zeile mit der Meldung. Nun habe ich deinen Vorschlag mit "-z" angewandt und siehe da, der spuckt nur noch das aus, was ich erwarte. Vielen Dank! :)

    Hier also nochmal das komplett funktionierende Skript, falls auch andere mal vor dem gleichen Problem stehen sollten. ;)


    Nun muss ich nur noch via Crontab das Skript regelmäßig aufrufen, aber das sollte das geringere Problem werden, da ich schon funktionierende Crontabs am Laufen habe. ;)


    Gruß, Wilfried


  • dreamshader: das is aber dirty ;)

    Du bist kein professioneller Entwickler, gell ;) ...

    Das sind nämlich - ich allen voran - i.d.R. faule Schweine, die nicht ein Zeichen mehr tippen, als unbedingt notwendig :fies:

    cheers,
    -ds-

  • Du bist kein professioneller Entwickler, gell ;) ...

    Doch, eigentlich irgendwie schon :D


    Das sind nämlich - ich allen voran - i.d.R. faule Schweine, die nicht ein Zeichen mehr tippen, als unbedingt notwendig :fies:

    Das versteh ich jetzt nicht... Du bist Professionell faul? :denker: :auslachen: :fies:

    • Offizieller Beitrag

    Ich stimme -ds- zu ;). Als entwickler ist jedes zeichen zuviel, verschenkte zeit. ;). Für die meisten Fälle reicht ne schnelle Lösung auch, Sonderfälle werden dann abgefangen wenn sie auftauchen. :)

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

  • *hust* also Professionel is wie ich finde nicht gleichzusetzen mit Entwickler :D

    Da gibts denk ich solche und solche - ich zähl mich dann eher zu den weniger faulen und typischen deutschen, eben perfektionist


    Es gibt immer mehrere Wege die zum Ziel führen, aber gerade für Anfänger muss es nicht unbedingt einer sein der auch schnell nach hinten los gehen kann - killall ist eben eigentlich zum beenden eines Prozesses und die anschliesende Prüfung ob der Befehl fehlerfrei ausgeführt wurde und falls nicht wird anhand dessen festgestellt das der Prozess nicht läuft, ist wirklich ne dreckige Lösung - absichtlich nen error erzeugen.... Also sorry aber das is nicht Professionel :-/

Jetzt mitmachen!

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