staging.inyokaproject.org

Programm: Linux Prozess neustarten

Status: Gelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

shellig

Anmeldungsdatum:
6. Juni 2019

Beiträge: 3

Hallo zusammen,

ich bin ziemlich frisch was die Shell Programmierung anbetrifft. Ich bin eigentlich mehr in der SAP Basis unterwegs und weniger in der Entwicklung. Im Einsatz haben wir ein SLES System im Einsatz und hier muss hin und wieder ein Prozess neugestartet werden. Da ich durch mein Studium ein wenig Programmier-Erfahrungen gesammelt im Java Umfeld denke ich, dass ich mich zu diesem Thema schon "hineinarbeiten" kann 😉

Das Programm hat folgenden Ablauf, welches alle 10 Minuten im crontab/cronjob laufen soll:

1. Schritt: Log-Datei finden über Befehl: find / -name backint.log -ls

2. Schritt: Vom 1. Ergebnis den Pfad verwenden ggf. in eine Variable abspeichern log_path

3. Schritt: Log Datei (log_path) auslesen über Befehl (letzte 30 Zeilen): tail -30 log_path

4. Schritt: Nach Textstelle suchen XX steht für eine Zahl: "Backint exited with Signal 01" = in Variable abspeichern: exit_signal

5. Schritt: String mit String vergleichen, wenn ausgelesener String mit vorgegebenen String gleich ist:

If-Statement: If exit_signal equals "Backint exited with Signal 01" do: ps -ef | grep prole | grep -v grep

6. Schritt: do: extrahiere Prozessnummer aus Schritt 5 und kill <Prozessnummer>

7. Schritt: else if exit_signal !equals "Backint exited with Signal 01" Do Nothing

Rein von der Logik her müsste das so funktionieren. Könnt ihr mir hierbei Tipps geben was ich hier beachten sollte? Ich stelle mir die Parts, wo ich Bash Befehle in der Console abfeuere etwas komplexer vor, weil ich auf das Ergebnis quasi irgendwie zugreifen muss. Also als Beispiel: find / -name backint.log -ls → von dem Ergebnis möchte ich das erste Suchergebnis in einer Variable abspeichern können (siehe Screenshot).

Ich danke euch im vorraus!

shellig

Bilder

Neral

Anmeldungsdatum:
3. Oktober 2007

Beiträge: 229

Moin,

ich würde erstmal gucken, ob es nicht etwas fertiges gibt, was dein Problem löst. Wenn dein SLES halbwegs aktuell ist und schon mit systemd läuft, könntest du dir zum Beispiel eine passende Service-Unit schreiben, die dein Programm startet und entsprechend neustartet kann, wenn es sich beendet.

Wenn systemd oder ein anderer process supervisor für dich keine Option ist und du schon Java kannst, dann könntest du das doch auch in Java umsetzen? Oder in einer beliebigen anderen Programmiersprache? Bash mag als Shell ganz in Ordnung sein, aber ich würde fast immer zu einer richtigen Programmiersprache raten.

shellig

(Themenstarter)

Anmeldungsdatum:
6. Juni 2019

Beiträge: 3

Neral schrieb:

Moin,

ich würde erstmal gucken, ob es nicht etwas fertiges gibt, was dein Problem löst. Wenn dein SLES halbwegs aktuell ist und schon mit systemd läuft, könntest du dir zum Beispiel eine passende Service-Unit schreiben, die dein Programm startet und entsprechend neustartet kann, wenn es sich beendet.

Wenn systemd oder ein anderer process supervisor für dich keine Option ist und du schon Java kannst, dann könntest du das doch auch in Java umsetzen? Oder in einer beliebigen anderen Programmiersprache? Bash mag als Shell ganz in Ordnung sein, aber ich würde fast immer zu einer richtigen Programmiersprache raten.

Hallo Neral,

vielen Dank für deinen Hinweis. Problem ist, dass der Prozess an sich ja schon läuft und nur anhand von Log-Files klassifiziert werden kann, ob man den Prozess killen muss. Ich kann mir gerade nicht vorstellen, wie ich das in Java umsetzen könnte bzw. so umgesetzt bekomme, dass das Java Programm auch das in der Shell/Bash ausführt. Gibts hier eine Libary die du mir empfehlen könntest?

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 10978

shellig schrieb:

vielen Dank für deinen Hinweis. Problem ist, dass der Prozess an sich ja schon läuft und nur anhand von Log-Files klassifiziert werden kann, ob man den Prozess killen muss.

Also wird der fehlgeschlagene Backint Prozess von einem Programm gestartet und nicht direkt vom Init-System? Ist das eine Besonderheit der Software (SAP HANA ProLe?), dass die nicht alleine in der Lage ist Fehlerfälle ordentlich abzufangen?

Mal ganz grob als Bash-Skript, das neuesten Zeilen aus dem Logfile kontinuierlich ausliest, auf das Vorkommen des Strings prüft und darauf hin alle Prozesse mit dem Namen prole killt (wenn man regelmäßig die letzten 30 Zeilen anschaut, kann es einem passieren, dass man das Vorkommen des Strings übersieht oder die selbe Meldung mehrfach auswertet):

1
2
3
4
5
6
7
8
#!/bin/bash
while read -r line
do
    if [[ "$line" =~ 'Backint exited with Signal 01' ]]
    then
        killall prole
    fi
done < <(tail -f -n1 backint.log)

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

seahawk1986 schrieb:

Also wird der fehlgeschlagene Backint Prozess von einem Programm gestartet und nicht direkt vom Init-System? Ist das eine Besonderheit der Software (SAP HANA ProLe?), dass die nicht alleine in der Lage ist Fehlerfälle ordentlich abzufangen?

Ja, das ist wirklich eine entscheidende Frage. Wenn Du selber steuern kannst, wie backint aufgerufen wird, dann kannst Du das auch einfach so machen:

1
2
3
4
5
#!/bin/sh

if ! backint arg1 arg2 ...; then
  pkill -TERM prole
fi

oder auch

1
2
3
#!/bin/sh

backint arg1 arg2 ... || pkill -TERM prole

Falls es darum geht, exakt 1 als Exit-Status zu erkennen:

1
2
3
4
5
6
7
#!/bin/sh

backint arg1 arg2 ...

if [ $? -eq 1 ]; then
  pkill -TERM prole
fi

Das Programm, das im Eingangsposting beschrieben wird, hat einige Auffälligkeiten. Z.B. wird der gesamte Verzeichnisbaum durchsucht; das müsste man doch zielgerichteter und effizienter machen. Reicht da nicht die Suche in /var oder gar /var/log? Du erwähnst "XX steht für eine Zahl", aber Du verwendest "XX" gar nicht in Deiner Beschreibung.

Übrigens sicher, dass das Executable nicht backintime heißt?

seahawk1986, wenn man das über die Logdatei machen will, was hältst Du von dieser Lösung?

1
2
3
4
5
6
7
#!/bin/sh

tail -F -n 0 /var/log/backint.log | {
  while :; do
    fgrep -q --line-buffered 'Backint exited with Signal 01' && pkill -TERM prole
  done
}

Das kann man ebenfalls permanent laufen lassen. Und wg. tail -F kann einen auch ein Logrotate nicht stören.

shellig

(Themenstarter)

Anmeldungsdatum:
6. Juni 2019

Beiträge: 3

Hallo zusammen,

mittlerweile habe ich ein kleines Java Script hierfür geschrieben mit Hilfe von JSch. Aber danke für eure Anregungen!

Antworten |