Finde (und töte) alte Prozesse


10

Grundsätzlich muss ich in der Lage sein, den Prozessbaum zu scannen und Prozesse zu finden, die einem bestimmten Namen entsprechen und mehr als eine Woche hintereinander ausgeführt werden. Sobald ich sie habe, muss ich sie töten. Alle Prozesse werden vom System weiterhin als ausgeführt angesehen, es wird nur keine Systemzeit verwendet. Sie werden normalerweise auch für immer in diesem Zustand sitzen.

Idealerweise möchte ich etwas Ähnliches finden, aber für Prozesse.

Das System ist Debian Linux und dieses wird von cron geschrieben und ausgeführt, so dass ich keine wirklichen Probleme mit etwas Großem, aber Verständlichem habe.


4
Wie werden Sie zwischen alten, aber wichtigen Prozessen und solchen unterscheiden, die Sie gerne töten?
Chopper3

Antworten:


9

Sie können dies mit einer Kombination aus ps, awk und kill tun:

ps -eo pid,etime,comm

Gibt Ihnen eine dreispaltige Ausgabe mit der Prozess-PID, der seit dem Start des Prozesses verstrichenen Zeit und dem Befehlsnamen ohne Argumente. Die verstrichene Zeit sieht wie folgt aus:

mm:ss
hh:mm:ss
d-hh:mm:ss

Da Sie Prozesse wünschen, die länger als eine Woche ausgeführt werden, suchen Sie nach Linien, die diesem dritten Muster entsprechen. Sie können awk verwenden, um die Prozesse nach Laufzeit und Befehlsnamen wie folgt herauszufiltern:

ps -eo pid,etime,comm | awk '$2~/^7-/ && $3~/mycommand/ { print $1 }'

Hiermit werden die Pids aller Befehle gedruckt, die mit 'mycommand' übereinstimmen und seit mehr als 7 Tagen ausgeführt werden. Pipe diese Liste in töten, und Sie sind fertig:

ps -eo pid,etime,comm | awk '$2~/^7-/ && $3~/mycommand/ { print $1 }' | kill -9

Schön, danke. Die Formatierungsoptionen in ps wurden komplett vergessen.
Ryaner

2
Dies zeigt nicht, dass Prozesse "länger als 7 Tage" ausgeführt werden. Es zeigt Ihnen Prozesse, die zwischen 7 Tagen und weniger als 8 Tagen ausgeführt werden.
Hobodave

etimesist praktischer - serverfault.com/a/393476/67675
poige

4

killall --quiet --older-than 1w process_name


1
Dies funktioniert unter Ubuntu 16.04 hervorragend und Sie können es mit dem Flag -i (interaktiv) verwenden, um zu testen und sicherzustellen, dass es auf die Prozesse abzielt, die Sie für richtig halten.
Ezwrighter

1

Alle Informationen, die Sie benötigen, können abgerufen werden ps -ef. Siehe die Spalte "STIME". Kombinieren Sie dies mit grep, um die Prozesse zu sortieren, die Sie benötigen. An diesem Punkt können Sie cutdie PID aller Matching-Prozesse abrufen und an übergeben kill.

Bitte lassen Sie mich wissen, wenn Sie weitere Informationen dazu wünschen.


Ich hätte gerne mehr Details. Die anderen Antworten sind einfach falsch.
Hobodave

1

Wenn Sie root sind, um den Müll loszuwerden (/ proc / fs proc / stat ...)

find /proc -maxdepth 1 -regex '/proc/[0-9]*' -type d -mtime +2 -exec basename {} \;

0

Wenn ein Prozess gestartet wird, wird ein Verzeichnis im Dateisystem / proc erstellt. Mit dem Befehl find können Sie Verzeichnisse abrufen, die älter als 7 Tage sind, und die Prozesse wie folgt beenden:

find /proc -user myuser -maxdepth 1 -type d -mtime +7 -exec basename {} \; | xargs kill -9 

Das funktioniert auch nicht. Wie es ist, generiert es diese Warnung und keine zusätzliche Ausgabe: find: warning: you have specified the -maxdepth option after a non-option argument -user, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it). Please specify options before other arguments.Wenn Sie -maxdepth als erste Ausgabe verschieben, werden keine Prozesse zurückgegeben, und ich bin mir sicher, dass viele übereinstimmen sollten.
Hobodave

auch warum mtime nicht ctime, wenn Sie nach dem Erstellungsdatum des Verzeichnisses suchen? Das Verzeichnis könnte theoretisch geändert werden, wenn ein zusätzliches
untergeordnetes Element

0

Niemand erwähnte hier ps-watcher . Ich denke, Sie können $ start_time möglicherweise mit der Funktion elapsed2sec vergleichen, bin mir aber nicht ganz sicher. Hier ist mein erster Gedanke:

[myproc]
occurs = every
trigger = elapsed2secs('$start_time') > 7*DAYS
action = <<EOT
  echo "$command has been running more than 7 days" | /bin/mail user\@host
  kill -TERM $pid
EOT

Keine Ahnung, ob das funktioniert, aber es sollte ein guter Ausgangspunkt sein.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.