test auf " "

Antworten
Nachricht
Autor
Gekegenheits-Scripter

test auf " "

#1 Beitrag von Gekegenheits-Scripter » 27. Mär 2007 12:28

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: Alles auswählen

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: Alles auswählen

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: Alles auswählen

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

Viele Grüße
Joe

sumsi

eine Lösung

#2 Beitrag von sumsi » 27. Mär 2007 19:18

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: Alles auswählen

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

Code: Alles auswählen

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

Benutzeravatar
jochen
prolinux-forum-admin
Beiträge: 699
Registriert: 14. Jan 2000 15:37
Wohnort: Jülich
Kontaktdaten:

#3 Beitrag von jochen » 28. Mär 2007 10:46

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: Alles auswählen

    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
Beiträge: 430
Registriert: 03. Mär 2006 23:16

#4 Beitrag von komsomolze » 05. Apr 2007 21:53

Code: Alles auswählen

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

Antworten