2016-06-02 18 views
1

Ich habe einen Prozess-Monitor erstellt, um auf das Vorhandensein eines laufenden Prozesses zu überprüfen, und wenn gefunden, müssen wir überprüfen, seine Eltern zu bestimmen, ob es akzeptabel ist oder nicht, es ist ein Sicherheitsüberprüfung grundsätzlich. Es funktioniert großartig, wenn ich nach laufenden Prozessen suche und mir Ergebnisse gebe, die ich erwarte. Aus irgendeinem Grund, wenn kein Prozess gefunden wird, spuckt er eine leere Zeile statt "ok" aus, wie ich es erwarten würde. Ich weiß, dass die Variable rmanRUNNING mit einer 0 gefüllt wird, wenn kein Prozess läuft, habe ich überprüft, also bin ich mir nicht sicher, warum die erste if-Anweisung nicht einfach auf die else übergeht und dann das Echo "ok" ausführt "Linie vor dem Schließen. Jede Hilfe wird sehr geschätzt. Siehe unten:Bash Prozess Monitor Skript Echo leer, wenn kein Prozess gefunden

#!/bin/bash 

rmanRUNNING=`ps -ef|grep rman|egrep -v grep|wc -l` 

if [ "$rmanRUNNING" -gt "0" ] 
then 
    PPIDs=($(ps -oppid= $(pgrep rman))) 
    kshddPID=($(pgrep -f 'ksh.*/rman_dd.ksh')) 
    for i in "${PPIDs[@]}" 
    do 
     : 
     for j in "${kshddPID[@]}" 
     do 
      : 
      if [ "$i" == "$j" ] 
       then 
        result="ok" 
      else 
       result="bad" 
       break 
      fi 
     done 
     if [ "$result" == "bad" ] 
      then 
       break 
     fi 
    done 
    echo "$result" 
else 
    echo "ok" 
fi 

ich etwas einfach nicht fehlen darf, ich kann es einfach nicht zu trennen scheinen, wenn ich dies zu vereinfachen, nur um das, wenn mit dem aktuellen bedingten und dann ein Echo gefolgt von einem anderen und ein echo, es scheint richtig zu funktionieren, also habe ich das gefühl, dass es etwas mit den schleifen im main zu tun hat, wenn das einen fehler verursacht, den ich nicht sehe. Oder es hat vielleicht mit einem Missverständnis zu tun, wie Pause funktioniert, so dass ich bis zu einem Punkt ausbricht, wo ich eine leere "Ergebnis" -Variable ausspreche und dann beendige, bin ich mir einfach nicht sicher.

Vielen Dank im Voraus!

+0

Ich glaube nicht, dass es mit dem Problem zusammenhängt, aber warum verwenden Sie 'pgrep' nicht, wenn Sie' rmanRunning' zuweisen? – Barmar

+0

Führen Sie Ihr Skript mit 'bash -x' aus, damit es Ihnen die Zeilen anzeigt, während sie ausgeführt werden. Dies sollte Ihnen sagen, wo es schief geht. – Barmar

+0

Sie erhalten eine leere Ausgabe, wenn '$ rmanRunning' größer als 0 ist, aber' $ kshddPID' leer ist, weil die innere 'for'-Schleife nichts bewirkt. – Barmar

Antwort

1

Das Problem ist, dass ps -ef | grep rman | grep -v grep mit dem Prozessnamen übereinstimmt. Wenn Sie also Ihr Skript ausführen, ist $rmanRunning nicht 0, weil es sich selbst zählt.

Verwenden Sie die Option pgrep mit der Option -x, sodass sie exakt mit dem Befehlsnamen übereinstimmt, anstatt nach einer Teilzeichenfolge zu suchen.

#!/bin/bash 

rmanRunning=$(pgrep -x rman | wc -l) 

if [ "$rmanRUNNING" -gt "0" ] 
then 
    PPIDs=($(ps -oppid= $(pgrep -x rman))) 
    kshddPID=($(pgrep -f 'ksh.*/rman_dd.ksh')) 
    for i in "${PPIDs[@]}" 
    do 
     : 
     for j in "${kshddPID[@]}" 
     do 
      : 
      if [ "$i" == "$j" ] 
       then 
        result="ok" 
      else 
       result="bad" 
       break 
      fi 
     done 
     if [ "$result" == "bad" ] 
      then 
       break 
     fi 
    done 
    echo "$result" 
else 
    echo "ok" 
fi 

Es gibt jedoch auch ein Problem mit Ihrer Gesamtlogik. Wenn Sie zwei rman_dd.ksh Prozesse haben und sie jeweils ein rman Kind haben, melden Sie bad, wenn Sie ein Elternteil mit dem anderen vergleichen. Ein einfacherer Weg besteht darin, einfach die beiden PID-Listen zu sortieren und zu vergleichen.

PPIDs=$(pgrep -x rman | sort) 
kshddPIDs=$(pgrep -f 'ksh.*rman_dd.ksh' | sort) 
if [ "$PPIDs" = "$kshddPIDs" ] 
then echo "ok" 
else echo "bad" 
fi 
+0

Sicher genug, und danke für den Vorschlag auch unten. Bin dankbar! – billhubb84

+0

BTW, wenn ich stattdessen vorgeschlagen hätte, dass Sie 'set -x' am Anfang des Skripts verwenden, hätten Sie es im Debugging gesehen. Ich werde mich daran für die Zukunft erinnern. – Barmar