69 Stimmen

Wie kann man alle Linux-Prozesse, die älter als ein bestimmtes Alter sind, beenden?

Ich habe ein Problem mit einigen zombieartigen Prozessen auf einem bestimmten Server, die von Zeit zu Zeit beendet werden müssen. Wie kann ich am besten diejenigen identifizieren, die länger als eine Stunde oder so laufen?

0voto

abyx Punkte 65176

Die Verwendung von ps ist der richtige Weg. Ich habe schon einmal etwas Ähnliches gemacht, aber ich habe den Quelltext nicht zur Hand. Im Allgemeinen hat ps eine Option, mit der man angeben kann, welche Felder angezeigt und nach welchen sortiert werden sollen. Sie können die Ausgabe nach der Laufzeit sortieren, den gewünschten Prozess mit grep suchen und ihn dann beenden.

HTH

0voto

David Jeske Punkte 2106

Falls jemand dies in C benötigt, können Sie readproc.h und libproc verwenden:

#include <proc/readproc.h>
#include <proc/sysinfo.h>

float
pid_age(pid_t pid)
{
        proc_t proc_info;
        int seconds_since_boot = uptime(0,0);
        if (!get_proc_stats(pid, &proc_info)) {
                return 0.0;
        }

        // readproc.h comment lies about what proc_t.start_time is. It's
        // actually expressed in Hertz ticks since boot

        int  seconds_since_1970 = time(NULL);
        int time_of_boot = seconds_since_1970 - seconds_since_boot;
        long  t = seconds_since_boot - (unsigned long)(proc_info.start_time / Hertz);

        int delta = t;
        float days = ((float) delta / (float)(60*60*24));
        return days;
}

0voto

user3743785 Punkte 33

Ich bin irgendwo darüber gestolpert dachte, es sei einfach und nützlich

Sie können den Befehl direkt in crontab verwenden,

* * * * * ps -lf | grep "user" |  perl -ane '($h,$m,$s) = split /:/,$F
+[13]; kill 9, $F[3] if ($h > 1);'

oder wir können es als Shell-Skript schreiben,

#!/bin/sh
# longprockill.sh
ps -lf | grep "user" |  perl -ane '($h,$m,$s) = split /:/,$F[13]; kill
+ 9, $F[3] if ($h > 1);'

Und nennen Sie es crontab wie folgt,

* * * * * longprockill.sh

0voto

Phil Hudson Punkte 163

Meine Version von sincetime oben von @Rafael S. Calsaverini :

#!/bin/bash
ps --no-headers -o etimes,args "$1"

Dadurch werden die Ausgabefelder vertauscht: zuerst die verstrichene Zeit, dann der vollständige Befehl einschließlich der Argumente. Dies ist vorzuziehen, da der vollständige Befehl Leerzeichen enthalten kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X