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?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.
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.
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
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".
- See previous answers
- Weitere Antworten anzeigen