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?
Antworten
Zu viele Anzeigen?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
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;
}
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
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.
- See previous answers
- Weitere Antworten anzeigen