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?

36voto

Jodie C Punkte 456

Wenn sie einfach nur getötet werden müssen:

if [[ "$(uname)" = "Linux" ]];then killall --older-than 1h someprocessname;fi

Wenn Sie sehen wollen, was es ist

if [[ "$(uname)" = "Linux" ]];then killall -i --older-than 1h someprocessname;fi

Le site -i Flagge werden Sie bei jeder Prozessübereinstimmung mit Ja/Nein gefragt.

36voto

yukondude Punkte 23093

Ich habe eine Antwort gefunden, die für mich funktioniert:

Warnung: dies findet und töten lang laufende Prozesse

ps -eo uid,pid,etime | egrep '^ *user-id' | egrep ' ([0-9]+-)?([0-9]{2}:?){3}' | awk '{print $2}' | xargs -I{} kill {}

(Wo benutzer-id ist die ID eines bestimmten Benutzers mit lang andauernden Prozessen).

Der zweite reguläre Ausdruck passt auf eine Uhrzeit, die eine optionale Tageszahl enthält, gefolgt von einer Stunden-, Minuten- und Sekundenkomponente, und somit mindestens eine Stunde lang ist.

22voto

Mark Harrison Punkte 281807

Für alles, was älter als einen Tag ist,

ps aux

gibt Ihnen die Antwort, aber sie geht auf den Tag genau, was vielleicht nicht so nützlich ist.

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   7200   308 ?        Ss   Jun22   0:02 init [5]
root         2  0.0  0.0      0     0 ?        S    Jun22   0:02 [migration/0]
root         3  0.0  0.0      0     0 ?        SN   Jun22   0:18 [ksoftirqd/0]
root         4  0.0  0.0      0     0 ?        S    Jun22   0:00 [watchdog/0]

Wenn Sie unter Linux oder einem anderen System mit dem Dateisystem /proc arbeiten, können Sie in diesem Beispiel nur sehen, dass der Prozess 1 seit dem 22. Juni läuft, aber keinen Hinweis darauf, wann er gestartet wurde.

stat /proc/<pid>

wird Ihnen eine genauere Antwort geben. Hier ist zum Beispiel ein genauer Zeitstempel für Prozess 1, den ps nur als Jun22 anzeigt:

ohm ~$ stat /proc/1
  File: `/proc/1'
  Size: 0               Blocks: 0          IO Block: 4096   directory
Device: 3h/3d   Inode: 65538       Links: 5
Access: (0555/dr-xr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2008-06-22 15:37:44.347627750 -0700
Modify: 2008-06-22 15:37:44.347627750 -0700
Change: 2008-06-22 15:37:44.347627750 -0700

9voto

ggasp Punkte 1460

Auf diese Weise erhalten Sie die Liste der zehn ältesten Prozesse:

ps -elf | sort -r -k12 | head -n 10

8voto

Jodie C. und andere haben darauf hingewiesen, dass killall -i verwendet werden, was in Ordnung ist, wenn Sie den Prozessnamen zum Töten verwenden wollen. Wenn Sie aber mit den gleichen Parametern wie pgrep -f verwenden, müssen Sie etwas wie das Folgende verwenden, indem Sie reine Bash und die /proc Dateisystem.

#!/bin/sh                                                                                                                                               

max_age=120 # (seconds)                                                                                                                                 
naughty="$(pgrep -f offlineimap)"                                                                                                                       
if [[ -n "$naughty" ]]; then # naughty is running                                                                                                       
  age_in_seconds=$(echo "$(date +%s) - $(stat -c %X /proc/$naughty)" | bc)                                                                              
  if [[ "$age_in_seconds" -ge "$max_age" ]]; then # naughty is too old!                                                                                 
    kill -s 9 "$naughty"                                                                                                                                
  fi                                                                                                                                                    
fi     

Damit können Sie Prozesse finden und beenden, die älter sind als max_age Sekunden unter Verwendung der vollständiger Prozessname d.h. der Prozess namens /usr/bin/python2 offlineimap kann durch Verweis auf "offlineimap" beendet werden, während die killall Die hier vorgestellten Lösungen funktionieren nur mit der Zeichenfolge "python2".

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