Wie kann man alle Prozesse beenden, deren Datum älter ist als heute?
14367
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.
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
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
Seien Sie sehr vorsichtig, um keine Daemon-Prozesse für das System zu beenden.
Warum müssen Sie Tonys Prozesse beenden, die älter sind als ein Tag alt?
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:
Starten Sie es
Drücken Sie S (Setup)
Gehen Sie zu den Spalten und wählen Sie STARTTIME
Drücken Sie < zum Sortieren, und wählen Sie START
Wählen Sie die Prozesse aus, die Sie mit Space beenden möchten
Alternativ können Sie auch \ (Backslash) verwenden, um nach Prozessnamen zu filtern.