[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Auswertung Prozeß-Laufzeit für Kill-Script, Vereinfachung?



Mahlzeit!

Benötige eine Funktion um Prozesse mit einer bestimmten
(überschrittenen) Laufzeit zu killen, also am Einfachsten ein
regelmaessig via cron gestartetes Skript. Hier werden im Beispiel
ein oder mehrere "ping" gekillt.
Mein Skript zum "normalen" Killen von Prozessen ohne Beachtung
der Laufzeit sieht so aus:

~~~~~snip~~~~~
#!/bin/sh
# Test, killt alle ping-Prozesse
PROG=ping
PID=`ps xua | grep -e $PROG | grep -v grep | grep -v pingkill.sh | sed -e 's/[^ ]* *\([0-9]*\).*/\1/g'`
echo $PID
kill -SIGTERM $PID
~~~~~snip~~~~~

$PID bekommt einfach alle zu killenden PIDs auferlegt und gut ist's.
Aber eben noch ohne die Bedingung "ping, welcher > 2h läuft".

Jetzt hat mir jemand "mal schnell" folgendes Skript zusammengebaut:

~~~~~snip~~~~~
#!/bin/sh
# Test, killt alle ping-Prozesse mit Laufzeit >= 2h

export LANG=C

PROG=ping

ps -e -o etime -o fname -o pid | while read etime fname pid;

 do

    if [ $fname = $PROG ]; then
        echo $etime | \
        awk -F: '
            {
             if( NF == 3 ) {
                            if (length($1) > 2 ) exit 1
                            if ( $1 + 0 > 1 ) exit 1
                            exit 0
                            }
             exit 0
            }'

        if [ $? -eq 1 ]; then
                           echo "kill now: $pid"
                           kill -SIGTERM $pid
                         else
                           echo "will not kill $pid"
        fi
    fi

 done
~~~~~snip~~~~~

Es wird praktisch mit der Ausgabe-Option "etime" von "ps" gearbeitet
und diese Ausgabe (z.B. "20-03:04:05" aka "20 Tage, 3h, 4m und 5s")
wird mittels awk zerlegt, als Field-Separator wird der ":" genommen.
Wenn nicht drei Felder vorhanden sind wird Exit-Status 0 gesetzt
(diesen Prozess nicht killen). Wenn das erste Feld größer als zwei
Zeichen ist (Prozess läuft mind. einen Tag) dann wird gleich Exit-Status
1 gesetzt (killen), anderenfalls (Prozess läuft noch keinen ganzen Tag)
wird das erste Feld ausgewertet. Da es ein String ist wird 0 addiert
und wenn als Ergebnis irgendwas >1 rauskommt (Prozess läuft mind. 2
Stunden) dann wird auch Exit-Status 1 gesetzt.
Am Ende wird der Exit-Status getestet und wenn 1 dann wird gekillt.

Das ist ist ein Wahnsinns-Konstrukt - geht das nicht auch irgendwie
einfacher?


Gruß,
ab



Reply to: