test auf " "

Post Reply
Message
Author
Gekegenheits-Scripter

test auf " "

#1 Post by Gekegenheits-Scripter »

Hallo Leute,

In einem erschaffenen init.s-start/stop-script habe ich die Prozessnummer des zu steuernden Programmes herausgeschnitten
und möchte diese auswerten.

Mit -gt, -lt, -eq geht das nicht, weil wenn das Programm nicht läuft diese Auswertung dann leer bleibt und derTest über
den Datentyp nichtnumerisch meckert.

Mit folgender Konstruktion geht das.

Code: Select all

if [ $PRGID -a " " ]
Aber ...
... der Script-Name muss anders als der Programm-Name lauten!
... die Logik ist genau anders herum, als ich mir das vorstelle:
Meine Vorstellung: leere Variable $PRGID UND Leerstelle wahr, dann ..., aber es ist genau dann nicht :(

Code: Select all

PRGID=`ps -ef|grep dnrd|grep -v grep|tr " " ":"|tr -s :|cut -f2 -d:`

   status)
        if [ $PRGID -a " " ]
          then
          echo "Programm-ID ist $PRGID"
          else
          echo "Programm wurde gestoppt"
        fi
        ;;

Seltsam oder erklärbar?
Benenne ich den Aufruf geauso wie das Programm, auch dnrd, dann

Code: Select all

 ./dnrd status
./dnrd: line 33: [: too many arguments
Programm wurde gestoppt
=LÜGE

Viele Grüße
Joe

sumsi

eine Lösung

#2 Post by sumsi »

N'abend,

habe dafür folgende Lösung gefunden:

Vermute, es werden während der Scriptabarbeitung kurzfristig Prozesse geboren, die die selbe Bezeichnung (Programm-Name) beinhalten.

1. Ersetze Programm-Name dnrb durch vollständigen Pfad.
2. Damit keine oder Prozess-ID NNNN durch test -gt ohne Fehler ausgewertet werden kann, addiere den Wert mit "0":

Code: Select all

let PRGID=$(ps ax|grep "/usr/local/sbin/dnrd"|grep -v grep|cut -d" " -f2)+0
dann geht auch

Code: Select all

if [ $PRGID -gt 0 ]
          then
          echo "2. Programm-ID ist $PRGID"
          else
          echo "Programm wurde gestoppt"
fi
bye sumsi

User avatar
jochen
prolinux-forum-admin
Posts: 699
Joined: 14. Jan 2000 15:37
Location: Jülich
Contact:

#3 Post by jochen »

Warum so kompliziert?
  1. Wenn wir vom dnrd reden, dessen Docs unter http://dnrd.sourceforge.net/docs.php liegen, dann schreibt er seine eigene PID in die Datei /var/run/dnrd.pid. Also einfach auf Existenz der Datei testen - keine da, kein Daemon. Ist die Datei vorhanden, auslesen und nach der PID fahnden: ps -p `cat /var/run/dnrd.pid`. Kriegt man keinen Output, ist kein Daemon vorhanden.
  2. Sollte es ein anderer dnrd sein, halt ich trotzdem die Vorgehensweise für falsch. Merke Dir doch einfach beim Starten des Daemon seine PID von Hand in der /var/run/dnrd.pid - dafür gibt es entsprechende Tools, oder man verwendet einen Vorschlag wie von Sumsi. Damit ist das Problem auf den vorhergehenden Punkt zurückgeführt.
  3. Sumsi hat zwar Deine Pipeline verändert, aber... wie soll ich sagen... schön ist die immer noch nicht! :) Anstelle 1000er Prozesse für nix & wieder nix mal kurz zum awk greifen:

    Code: Select all

    ps -ef | awk '$8 == "/usr/sbin/dnrd" {print $2}'
    awk läuft über alle Zeilen, die ihm das ps-Kommando liefert. Wenn die Bedingung "Achtes Feld soll gleich /usr/sbin/dnrd sein" greift, wird der Inhalt der zweiten Spalte (PID) ausgegeben - basta.
Viel Spass beim Weiterbasteln,
Jochen
Die grösste Lüge der EDV? "Mal eben..."

komsomolze
Posts: 430
Joined: 03. Mar 2006 23:16

#4 Post by komsomolze »

Code: Select all

ps h -C dnrd | awk '{print $1}'
mfg komsomolze

Post Reply