Frage zu Bash-Programmierung

Hallo,

ich möchte mir ein Shellscript schreiben, dass in etwa folgendes tut:

  • mit ps -aef|grep bla prüfen ob der Prozess „bla“ läuft
  • wenn er läuft, nix machen
  • wenn er nicht läuft, ihn mit ./bla starten
  • diese Abfrage ca. jede Minute wiederholen

Wie stelle ich das am besten an? Ich habe wenig bis gar keine Ahnung von Shellprogrammierung, aber dieses Script brauche ich relativ dringend.

Vielen Dank für jegliche Tips.

Gruß, Robert

Hallo Robert,

  • mit ps -aef|grep bla prüfen ob der Prozess „bla“ läuft
  • wenn er läuft, nix machen
  • wenn er nicht läuft, ihn mit ./bla starten
  • diese Abfrage ca. jede Minute wiederholen

das Problem an dem Script ist, dass das grep auf den Prozessnamen sich auch selbst mit zurück liefert, daher kann man den Rückgabewert nicht auswerten. Ich habe dafür bisher auch noch keine saubere Lösung gefunden. Vielleicht weiss ja jemand wie’s geht.

Diese Lösung ist definitiv nicht sauber und nicht getestet, sollte aber trotz allem funktionieren.

#!/bin/sh
var=ps -eaf | grep prozessname | wc -l
if [$var -lt „2“]; then
programmname
else
echo „alles ok“
fi
exit 0

Das Script dann über Cron minütlich starten lassen. BTW gute Lektüre zum Scriptprogrammieren gibt’s hier http://www.tldp.org/LDP/abs/html/index.html

Grüße
Martin

ich möchte mir ein Shellscript schreiben, dass in etwa
folgendes tut:

  • mit ps -aef|grep bla prüfen ob der Prozess „bla“ läuft
  • wenn er läuft, nix machen
  • wenn er nicht läuft, ihn mit ./bla starten
  • diese Abfrage ca. jede Minute wiederholen

Das klingt nach einem kruden Gewurschtel. Was genau hast Du vor?

Wie stelle ich das am besten an? Ich habe wenig bis gar keine
Ahnung von Shellprogrammierung, aber dieses Script brauche ich
relativ dringend.

Ich würde sowas mit daemontools machen. Dann kannst Du das auch nett an- oder abschalten.

Sebastian

Das klingt nach einem kruden Gewurschtel. Was genau hast Du
vor?

Naja, genau das was da steht :wink: Hintergrund: bei uns in der Firma muss man auf bestimmten Unix-Maschinen ab und zu einen Prozess starten. Aus noch ungeklärter Ursache beendet der sich aber manchmal von alleine. Daher möchte ich regelmäßig schauen ob der Prozess noch läuft, und wenn nicht, ihn neu starten bis das eigentliche Problem gelöst ist.

Robert

Das klingt nach einem kruden Gewurschtel. Was genau hast Du
vor?

Naja, genau das was da steht :wink: Hintergrund: bei uns in der
Firma muss man auf bestimmten Unix-Maschinen ab und zu einen
Prozess starten. Aus noch ungeklärter Ursache beendet der sich
aber manchmal von alleine. Daher möchte ich regelmäßig schauen
ob der Prozess noch läuft, und wenn nicht, ihn neu starten bis
das eigentliche Problem gelöst ist.

Wenn Du den Prozess im Vordergrund laufen lassen kannt: daemontools
ansonsten:

STARTPROC(8) The SuSE boot concept STARTPROC(8)


NAME
 Startproc - Start processes identified by full path name

SYNOPSIS
 startproc [+/-] [-s] [-u uid] [-g gid] [-v] [-e] [-l
 log\_file|-q] [-f pid\_file] /path/to/executable [arguments
 for executable]

DESCRIPTION
 startproc check for all processes of the specified exe­
 cutable and starts it if no processes are found.

Robert

das Problem an dem Script ist, dass das grep auf den
Prozessnamen sich auch selbst mit zurück liefert, daher kann
man den Rückgabewert nicht auswerten. Ich habe dafür bisher
auch noch keine saubere Lösung gefunden. Vielleicht weiss ja
jemand wie’s geht.

Hi Martin,

um genau diesen Effekt zu vermeiden (grep liefert auch sich selbst zurück), könnte man eine zwei Pipe dranhängen, etwa so:

ps -eaf | grep prozessname | grep -v grep

dann klappts auch mit dem Nachbarn… (natürlich nur, wenn der Prozessname nicht den String ‚grep‘ selbst enthält). Alternative, wenn der Prozessname z.B. ‚hugo‘ ist und man diesen hart eincodieren kann:

ps -eaf | grep [h]ugo

(ist ein bischen tricky, funktioniert aber trotzdem :smile:

gruß
bbr