Programm überwachen geht nicht

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Bulletprof
Beiträge: 6
Registriert: 06.05.2010 20:43:50

Programm überwachen geht nicht

Beitrag von Bulletprof » 06.05.2010 21:05:09

Hallo zusammen
Ich versuche gerade ein script unter debian 5.04 laufen zu lassen das unter ubuntu 9.04 merkwürdiger weise gut läuft.
Nur bei debian will es nicht. Es soll nur abfragen ob ein programm läuft und wenn nicht soll er erst ein programm stoppen und dann zwei wieder starten.

Code: Alles auswählen

#!/bin/sh
if ps aux | grep -v grep | grep -c Programmname1
then
exit 1
else
killall -9 /pfad/Programmname2
sleep 10
/pfad/programmname1
sleep 40
/pfad/Programmname2
sleep 15
fi
exit 0
Er bekommt ja nur eine 0 wenn das programm NICHT läuft und eine 1 wenn es läuft.
Habe ich probiert und die info kommt auch, nur er hört wenn er die info 1 bekommt nicht bei "exit 1" auf.
Er läuft immer das ganze script durch und startet obwohl das programm läuft !
Das ist doch nur ne kleinigkeit oder ?
ich dank euch.

Bulletprof
Beiträge: 6
Registriert: 06.05.2010 20:43:50

Re: Programm überwachen geht nicht

Beitrag von Bulletprof » 06.05.2010 23:03:26

Weiss das keiner :-)
Dann vielleicht so:

Code: Alles auswählen

if ps aux | grep -v grep | grep -c Programmname1 >0
then
exit 1
er soll also aufhören wenn er einen grösseren wert bekommt als 0.
wie schreibe ich so eine angabe ?

Benutzeravatar
JaKlaRo
Beiträge: 121
Registriert: 06.03.2008 15:00:00
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Programm überwachen geht nicht

Beitrag von JaKlaRo » 06.05.2010 23:51:46

Bulletprof hat geschrieben:

Code: Alles auswählen

#!/bin/sh
if ps aux | grep -v grep | grep -c Programmname1
then
exit 1
else
killall -9 /pfad/Programmname2
sleep 10
/pfad/programmname1
sleep 40
/pfad/Programmname2
sleep 15
fi
exit 0
Das ist doch nur ne kleinigkeit oder ?
Schreib hinter "exit 1" "fi" und entferne "else", dann sollte es funktionieren.

MfG
JaKlaRo

Bulletprof
Beiträge: 6
Registriert: 06.05.2010 20:43:50

Re: Programm überwachen geht nicht

Beitrag von Bulletprof » 07.05.2010 00:46:29

Nee leider geht nicht er startet weiterhin die programme mehrfach mit:

Code: Alles auswählen

if ps aux | grep -v grep | grep -c Programmname1
then
exit 1
fi
Ich müsste etwas haben wie ist das ergebnis der abfrage:
if ps aux | grep -v grep | grep -c Programmname1

grösser oder ungleich 0 dann beenden.

Benutzeravatar
JaKlaRo
Beiträge: 121
Registriert: 06.03.2008 15:00:00
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Programm überwachen geht nicht

Beitrag von JaKlaRo » 07.05.2010 08:58:09

Hallo,

Code: Alles auswählen

if ps aux | grep -v grep | grep -c Programmname1
kommt nicht mit Variablen zurecht, das hatte ich nicht getestet und kann Dir auch nicht erklären warum das so ist.

Code: Alles auswählen

#!/bin/sh
count=$(ps -C $1 | wc -l)
if [ $count -gt 1 ] # Programm läuft
then
echo $count
exit 1
fi
# Programm läuft nicht
echo "kill"
exit 0
Dies sollte jetzt aber funktionieren.

Gruß
JaKlaRo

Benutzeravatar
CrashMan
Beiträge: 340
Registriert: 07.04.2007 14:04:27
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: MD

Re: Programm überwachen geht nicht

Beitrag von CrashMan » 07.05.2010 10:02:28

Code: Alles auswählen

#!/bin/sh
if [ -z `pidof programm1` ] # Programm läuft nicht
then
  /pfad/programmname1 &
  /pfad/Programmname2 &
fi
Wenn es keine Scripts, sondern eigenständige Programme sind, sollte das auch funktionieren.
Bei Scripts läufts afaik mit z.B. bash und die pid kann nicht so abgefragt werden.

mfg
debian stable + arch

Bulletprof
Beiträge: 6
Registriert: 06.05.2010 20:43:50

Re: Programm überwachen geht nicht

Beitrag von Bulletprof » 07.05.2010 13:39:15

JaKlaRo hat geschrieben:Hallo,

Code: Alles auswählen

if ps aux | grep -v grep | grep -c Programmname1
kommt nicht mit Variablen zurecht, das hatte ich nicht getestet und kann Dir auch nicht erklären warum das so ist.

Code: Alles auswählen

#!/bin/sh
count=$(ps -C $1 | wc -l)
if [ $count -gt 1 ] # Programm läuft
then
echo $count
exit 1
fi
# Programm läuft nicht
echo "kill"
exit 0
Dies sollte jetzt aber funktionieren.

Gruß
JaKlaRo
Ich habe blödsinn erzählt... :roll:
Der einzige konstante wert der immer klar ist lautet 0 #programm läuft nicht !
Wenn das programm läuft bekomme ich doch nicht nur eine 1 bei der abfrage sondern mal 5 mal 10 mal 7.
Darum muss ich auf der 0 aufbauen weil das die einzig klare aussage ist.
also sollte er nichts tun wenn er etwas anderes als das ergebnis 0 bekommt.

Kann man deinen script mit 0 auch machen ? also so:

Code: Alles auswählen

#!/bin/sh
count=$(ps -C $0 | wc -l)
if [ $count -gt 0 ] # Programm läuft nicht
then
/pfad/programm1 &
fi
exit 0 
Nur wo bringe ich dort den namen des programmes unter das abgefragt wird ???

@Crashman
Auch dein script startet das programm immer wieder obwohl es schon läuft.
liegt das an der tatsache das es doch nicht immer nur 1 und 0 wieder gibt sondern auch andere werte ??
sorry für die fehlinfo wollte euch nicht verwirren.

Benutzeravatar
JaKlaRo
Beiträge: 121
Registriert: 06.03.2008 15:00:00
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Programm überwachen geht nicht

Beitrag von JaKlaRo » 07.05.2010 15:16:43

Bulletprof hat geschrieben: Ich habe blödsinn erzählt... :roll:
Der einzige konstante wert der immer klar ist lautet 0 #programm läuft nicht !
Wenn das programm läuft bekomme ich doch nicht nur eine 1 bei der abfrage sondern mal 5 mal 10 mal 7.
Darum muss ich auf der 0 aufbauen weil das die einzig klare aussage ist.
also sollte er nichts tun wenn er etwas anderes als das ergebnis 0 bekommt.

Kann man deinen script mit 0 auch machen ? also so:
Dann so:

Code: Alles auswählen

#!/bin/sh
count=$(ps -C $1 | wc -l)
if [ $count -eq 1 ]
then
echo "kill"
exit 0
fi
echo $count
exit 1
So, nehmen wir an das Skript ist als test.sh gespeichert und Du willst conky überprüfen, dann

Code: Alles auswählen

test.sh conky
Wenn conky nicht läuft, ist der Wert von count 1, wenn conky x-mal läuft, dann ist der Wert von count x+1. Das liegt daran, dass im Skriptaufruf conky als Argument auftaucht und daher mitgezählt wird. count kann nicht den Wert 0 annehmen. Ich hoffe, Du hast alles verstanden, sonst ruhig nochmal nachfragen.

Gruß
JaKlaRo

Bulletprof
Beiträge: 6
Registriert: 06.05.2010 20:43:50

Re: Programm überwachen geht nicht

Beitrag von Bulletprof » 07.05.2010 17:44:37

Ich glaube ich habe es verstanden !
Daraufhin habe ich mal die sache so angefangen mit einträgen in einer logdatei:

Code: Alles auswählen

#!/bin/sh
count=$(ps aux | grep -v grep | grep -c programm1)
if [ "$count" -lt 1 ];    # Programm1 läuft nicht
then
echo "`date` programm1 läuft nicht, reload beginnt jetzt" >> /pfad/programm_check.log
killall -9 /pfad/programm2
echo "`date` programm2 wurde beendet" >> /pfad/programm_check.log
sleep 10
/pfad/programm1 &
echo "`date` programm1 wurde neu Gestartet" >> /pfad/programm_check.log
sleep 20
/pfad/programm2 &
echo "`date` programm2 wurde neu Gestartet" >> /pfad/programm_check.log
echo "`date` Server läuft wieder Optimal" >> /pfad/programm_check.log
echo "---------------------------------------------------------" >> /pfad/programm_check.log
sleep 10
fi
Ich habe es wieder mit grep gemacht weil es super wäre wenn das script unter ubuntu genauso läuft wie unter debian.
Und seid einer halben stunde lasse ich es laufen und stoppe auch mal von hand. Bis jetzt macht er alles richtig !
Es sind ja 2 programme die in der richtigen reihenfolge gestartet werden müssen deswegen muss ich erst programm2 beenden und dann wieder nacheinander starten.
Was meinst du könnte man das so lassen oder kann man was verbessern ?

Benutzeravatar
JaKlaRo
Beiträge: 121
Registriert: 06.03.2008 15:00:00
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Programm überwachen geht nicht

Beitrag von JaKlaRo » 07.05.2010 18:50:20

Bulletprof hat geschrieben:Ich glaube ich habe es verstanden !
Sehr schön.

Code: Alles auswählen

#!/bin/sh
count=$(ps aux | grep -v grep | grep -c programm1)
if [ "$count" -lt 1 ];    # Programm1 läuft nicht
then
    echo "`date` programm1 läuft nicht, reload beginnt jetzt" >> /pfad/programm_check.log
    killall -9 /pfad/programm2
    echo "`date` programm2 wurde beendet" >> /pfad/programm_check.log
    sleep 10
    /pfad/programm1 &
    echo "`date` programm1 wurde neu Gestartet" >> /pfad/programm_check.log
    sleep 20
    /pfad/programm2 &
    echo "`date` programm2 wurde neu Gestartet" >> /pfad/programm_check.log
    echo "`date` Server läuft wieder Optimal" >> /pfad/programm_check.log
    echo "---------------------------------------------------------" >> /pfad/programm_check.log
    sleep 10
fi
Einrückungen erleichtern das Lesen von Code. :P
Ich habe es wieder mit grep gemacht weil es super wäre wenn das script unter ubuntu genauso läuft wie unter debian.
Ich habe grep nur entfernt wegen der Variablen, nicht wegen Ubuntu, mein Ansatz sollte auch unter Ubuntu laufen, aber wenn Dir die grep-Lösung besser gefählt ist das kein Problem.
Und seid einer halben stunde lasse ich es laufen und stoppe auch mal von hand. Bis jetzt macht er alles richtig !
Es sind ja 2 programme die in der richtigen reihenfolge gestartet werden müssen deswegen muss ich erst programm2 beenden und dann wieder nacheinander starten.
Was meinst du könnte man das so lassen oder kann man was verbessern ?
Wenn programm1 öfter nicht läuft kannst Du das Skript per Cronjob regelmässig laufen lassen und Du solltest Dir überlegen, ob es reicht, nur die Zeiten des Ausfalls und Startens in die Logdatei zu schreiben. Für solchen Infos kannst Du Dir auch eine Mail schicken lassen.

Code: Alles auswählen

man mail
Das Beenden von programm2 würde ich so machen

Code: Alles auswählen

process_nr=$(pidof programm2)
kill $process_nr
Gruß
JaKlaRo

Bulletprof
Beiträge: 6
Registriert: 06.05.2010 20:43:50

Re: Programm überwachen geht nicht

Beitrag von Bulletprof » 07.05.2010 20:32:45

Ja das script läuft alle 2 minuten per cronjob durch !
Der eintrag in die logdatei reicht mir aus, damit ich mal schauen kann....wie oft schmiert es eigentlich so pro tag ab.
Man könnte ja auch einen eintrag machen lassen wenn alles inordnung ist nur würde die datei dann unnötig anschwillen :-)
Die änderung mit:
process_nr=$(pidof programm2)
kill $process_nr

werde ich gleich mal probieren.
Ich dank dir vielmals für deine hilfe :hail:
Ich hoffe bei meinem nächsten problem kann ich wieder auf deine hilfe zählen :-)
schönes wochenende
bye

Antworten