Wie kann man alle Prozesse beenden, deren Datum älter ist als heute?

14370
Tony

Ich gebe den Befehl aus ps -aux | grep tony. Es zeigt die folgende Ausgabe an

tony 10986 0.0 0.0 33532 464 ? S Feb01 0:00 vncconfig -iconic tony 10988 0.0 0.0 86012 512 ? S Feb01 0:00 twm tony 15553 0.0 0.0 92404 1848 ? S 10:34 0:00 sshd: tony@pts/34 tony 15554 0.0 0.0 66232 1680 pts/34 Ss+ 10:34 0:00 -bash 

Ich möchte alle meine toten Prozesse, die älter als heute sind, töten .

Ich hätte den Befehl geben können kill -9 10986; kill -9 10988, aber ich würde gerne in einem Befehl ausführen und es gibt auch viele tote Prozesse, die anstehen.

Jede Hilfe wäre sehr dankbar.

1
Die Frage ist, wie man ein Shell-Programm für die Verarbeitung schreibt. Dies ist eine Frage der Programmierung und ist daher ein Thema für StackOverflow, bei dem es um die Programmierung geht - einschließlich der Shell-Programmierung. Und selbst wenn der Code nicht in der Shell geschrieben ist (vielleicht Perl oder Python), geht es immer noch darum, ein Programm zu schreiben, um einen Job zu erledigen, und ist daher für StackOverflow ein Thema. Jonathan Leffler vor 13 Jahren 0
Verwenden Sie "ps ux" oder "ps -u tony" anstelle von "grep", um Fehlalarme zu vermeiden. Dennis Williamson vor 13 Jahren 0
Als heute oder älter als 24 Stunden? Mikel vor 13 Jahren 0
@Dennis Ja, das ist besser - danke für den Vorschlag vor 13 Jahren 0

4 Antworten auf die Frage

4
Community

Achten Sie zuerst auf den Ratschlag von Jonathan

Nun, nachdem Sie das getan haben, versuchen Sie etwas davon

# Find all process that are owner by "tony" # - Print out the process id (pid), and the start time (lstart) # Find all the rows that aren't for today # Cut that down to just the first field (process id) PROCS="$(ps -u tony -o pid,lstart | fgrep -v " $( date '+%a %b %d' )" | cut -d' ' -f1)"  # Run through each process and ask it to shutdown for PROC in $PROCS do kill -TERM $PROC done  # Wait for 10 seconds to give the processes time to stop sleep 10  # Kill off any processes that still exist for PROC in $PROCS do [ -r /proc/$/status ] && kill -KILL $PROC done 

Obwohl Sie dies möglicherweise nicht möchten.
Alle Prozesse sind an Sitzungen gebunden. Wenn Sie herausfinden können, was Ihre alte VNC-Sitzung war, sollten Sie die Prozesse, die zu dieser Sitzung gehören, beenden können, anstatt nur nach "alten" Prozessen zu suchen.

1
Jonathan Leffler
  1. Seien Sie sehr vorsichtig, um keine Daemon-Prozesse für das System zu beenden.
  2. Warum müssen Sie Tonys Prozesse beenden, die älter sind als ein Tag alt?
  3. SIGKILL (-9) zu senden ist brutal. Es ist besser, SIGTERM (15) und SIGHUP (1) zu senden, bevor Sie SIGKILL senden. Die SIGHUP- und SIGTERM-Signale geben dem Prozess die Möglichkeit, sich zu reinigen und kontrolliert zu beenden. Durch einfaches Senden von SIGKILL können beispielsweise Sperrdateien nicht bereinigt werden.

Um eine Liste Ihrer Prozesse zu erhalten, die vor langer Zeit gestartet wurden, sodass der Prozess ein Datum anstelle einer Zeit im Zeitfeld hat, können Sie Folgendes verwenden:

pids=$(ps -aux | awk '$1 ~ /^tony$/ && $9 !~ /[0-2]?[0-9]:[0-5][0-9]/ { print $2; }') for signal in 15 1 9 do kill -$signal $pids 2>/dev/null sleep 1 done 

Das awkSkript sucht nach Zeilen, die mit 'tony' beginnen, aber keiner Zeit in Spalte 9 entsprechen - sie haben ein Datum und sind daher 'alt'. Wie vorgeschlagen, erfolgt die Signalisierung in 3 Schritten: Beenden, Auflegen, Töten. Mit Vorsicht können Sie den Benutzernamen an das awkSkript übergeben, anstatt den Namen als fest zu verknüpfen tony.

@Jonathan Mein Systemadministrator beschwert sich über meine toten Jobs, weil ich manchmal NICHT ordnungsgemäß beendet wurde, z. B. vncserver. Also bat er mich, alle Prozesse aufzuräumen, die ich nicht brauche. vor 13 Jahren 0
@ Tony: Sie meinen also 'alle meine Prozesse, die vor heute gestartet wurden', nicht 'alle Prozesse, die vor heute gestartet wurden'; Es gibt einen großen Unterschied. Und Sie haben immer das Recht, alle Ihre Prozesse zu bereinigen, wenn Sie möchten. Jonathan Leffler vor 13 Jahren 0
Ja, ich meinte alle meine toten Jobs. Vielen Dank für deine Hilfe. vor 13 Jahren 0
0
mob

In Linux können Sie alle Ihre Prozesse sehen, die mindestens 24 Stunden alt sind

find /proc -name [1-9]* -maxdepth 1 -user tony -mtime +0 

und nimm sie mit sowas heraus

for signal in -TERM -HUP -KILL do kill $signal \ $(find /proc -name [1-9]* -maxdepth 1 -user tony -mtime +0 | cut -d/ -f3) sleep 3 done 

Das Parsen psist sicherlich eine Option, aber ich versuche das zu vermeiden, da die Optionen und Ausgabeformate für diesen Befehl von System zu System so stark variieren können.

0
ClojureMostly

Wenn Sie dies nicht für das Scripting benötigen, sondern nur für eine einmalige Anforderung, sollten Sie auch htop überprüfen . Schritte:

  1. Starten Sie es
  2. Drücken Sie S (Setup)
  3. Gehen Sie zu den Spalten und wählen Sie STARTTIME
  4. Drücken Sie < zum Sortieren, und wählen Sie START
  5. Wählen Sie die Prozesse aus, die Sie mit Space beenden möchten
  6. Alternativ können Sie auch \ (Backslash) verwenden, um nach Prozessnamen zu filtern.
  7. Töte Prozesse mit k .