Alexander Foken: (PERL) Das Environment und ps machen mich fertig :'-(

Beitrag lesen

Moin!

Zum Beispiel bekomme ich in meiner Shell normalerweise mit ps -ef | less die ganze Ausgabe von ps, aber das Programm oben bekommt, in seiner Umgebung, nur die ersten 80 Zeichen.

Auf der Shell kriegst Du aber auch nur soviele Zeichen, wie Dein Terminal(-fenster) breit ist. ps fragt also wahrscheinlich das Terminal ab, wieviel es darstellen kann. Ich vermute mal, Dein ip-up dings laeuft nicht in einem Terminal und daher wird einfach der kleinste gemeinsame Nenner angenommen, naemlich 80 Zeichen.

Schau Dir mal die Option -w von ps an. Evtl. mehrmals angeben.

So long

Moin Moin !

Also zuerst solltest Du mal dafür sorgen, daß Du exakt das ps startest, das Du auch haben willst, sehr wahrscheinlich /bin/ps oder /usr/bin/ps. Ansonsten baust Du ein Sicherheitsloch.

Dann rufst Du ps mit der -w-Option (mehrfach) auf, so daß Du /bin/ps -wwwwww hast.

Und Du setzt vor dem Open/Backtick $ENV{'TERM'} auf 'linux' oder 'vt100', damit Du ein halbwegs brauchbares Terminal vorgibst.

Du kannst /sbin/pidof benutzen, um ein Programm nach Namen zu suchen, z.B. liefert 'pidof init' die PID des init-Prozesses, also 1.

Dein Algorithmus fällt auf Programme rein, die irgendwo den String laufendes_programm.pl in der Ausgabe von ps enthalten.

Mit folgendem Script lege ich dein Programm garantiert rein:

#!/bin/bash
while true ; do
  /bin/echo Ich bin gemein ich leg ihn rein denn er sucht nur laufendes_programm.pl tralalalala
done

MEINE ALTERNATIVE:

Warum schreibst Du in dem zu überwachenden Script nicht einfach die PID nach /tmp/blabla.pid oder /var/run/blabla.pid raus und löscht sie unmittelbar vor dem Ende des Programms wieder ?

Dann beschränkt sich die Prüfung auf ein Shell-Script (das Du fast 1:1 in Perl nachprogrammieren kannst):

#!/bin/bash
PIDFILE=/var/run/blabla.pid
if [ -f "$PIDFILE" ] ; then
   # Datei ist da, läuft das Programm ?
   if [ -d /proc/cat "$PIDFILE" ] ; then
      # Pseudo-Verzeichnis des Prozesses (/proc/12345) vorhanden
      echo "Programm laeuft"
   else
      echo "Oooops. Abgestuerzt und PID-Datei nicht geloescht."
      rm -f "$PIDFILE"
   fi
else
   echo "Programm laeuft nicht"
fi

Das ist übrigens Standard-Verhalten von Unix-Programmen, sei mal angemerkt.

Alexander