Erstens, ja, ich habe diese Frage gesehen:
Finden (und beenden) Sie alte Prozesse
Die Antworten dort sind falsch und funktionieren nicht. Ich habe entsprechend abgestimmt und kommentiert.
Die Prozesse, die ich beenden möchte, sehen wie folgt aus ps aux | grep page.py
:
Apache 424 0,0 0,1 6996 4564? S 07:02 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py Apache 2686 0.0 0.1 7000 3460? S Sep10 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py Apache 2926 0,0 0,0 6996 1404? S Sep02 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py Apache 7398 0,0 0,0 6996 1400? S Sep01 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py Apache 9423 0.0 0.1 6996 3824? S Sep10 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py Apache 11022 0,0 0,0 7004 1400? S Sep01 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py Apache 15343 0,0 0,1 7004 3788? S 09.09. 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py Apache 15364 0,0 0,1 7004 3792? S 09.09. 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py Apache 15397 0,0 0,1 6996 3788? S 09.09. 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py Apache 16817 0,0 0,1 7000 3788? S 09.09. 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py Apache 17590 0,0 0,0 7000 1432? S Sep07 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 24448 0.0 0.0 7000 1432? S Sep07 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py Apache 30361 0,0 0,1 6996 3776? S 09.09. 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py
Ich suche nach einem einfachen täglichen Cron, der alle page.py
Prozesse findet und beendet, die älter als eine Stunde sind.
Die akzeptierte Antwort auf die oben genannte Frage funktioniert nicht, da sie nicht mit einem bestimmten Zeitraum übereinstimmt. Sie stimmt einfach mit Prozessen überein, die zwischen 7 Tagen und 7 Tagen, 23 Stunden, 59 Minuten und 59 Sekunden ausgeführt wurden. Ich möchte keine Prozesse beenden, die seit 1-2 Stunden ausgeführt werden, sondern nur Prozesse, die länger als 1 Stunde dauern .
Die andere Antwort auf die oben genannte Frage mit find
funktioniert nicht, zumindest nicht unter Gentoo oder CentOS 5.4. Sie gibt entweder eine Warnung aus oder gibt nichts zurück, wenn der Hinweis dieser Warnung befolgt wird.
Dank Christophers Antwort konnte ich es an folgendes anpassen:
-mmin
war der Befehl zum Suchen, den ich vermisst habe.quelle
find /proc -maxdepth 1 -type d -name 1 -mmin +60 -ls
- / sbin / init wird nicht aufgelistet, obwohl die Betriebszeit Tage und nicht Stunden beträgt. Es scheint, dass Sie sich nicht auf die Änderungszeit von / proc / verlassen können.find funktioniert nicht immer, nicht jedes System verfügt über verfügbare Zeiten, und es könnte mein regulärer Newb-Status sein, aber ich glaube nicht, dass Sie mehr als das brauchen:
Sie können das dann weiterleiten, um zu töten oder was auch immer Ihre Notwendigkeit sein mag.
quelle
ps
, aber ich würde das Vielfachegrep
zu einem Einfachen faltenawk
und aus Sicherheitsgründen die Musterübereinstimmungen auf bestimmte Spalten beschränken (um z. B. eine Befehlsnamenübereinstimmung auszuschließen) Baumeister usw.)Wenn Sie möchten, können Sie eine
ps
Liste von PIDs eingeben, in denen nachgeschlagen werden soll, z. B .:quelle
etimes
funktioniert nur für neuereps
Ich denke, Sie können einige dieser vorherigen Antworten an Ihre Bedürfnisse anpassen. Nämlich:
Oder
Ich denke, der zweite passt am besten zu Ihren Bedürfnissen. Die Find-Version würde andere Prozesse des Benutzers -
Christopher Karel - nerven
quelle
kill -9
nur als letzten Ausweg. Verwenden Sie-SIGINT
oder-SIGTERM
.ps
Gibt die Zeit im^..:..$
Format aus, wenn sie weniger als eine Stunde beträgt.quelle
psmisc
Dienstprogramm zu erklären ? Das OP erwähnte CentOS; ist es als RPM verfügbar?Das Problem
Umwandeln der
etime
(abgelaufenen Zeit)ps
Befehlsspalte in Sekunden. Die Zeitangabe erfolgt in diesem Format[[dd-]hh:]mm:ss
. Neuere Versionen vonps
haben eineetimes
Spalte, die denetime
Wert in Sekunden ausgibt .Die Lösung: einfache Custom-Awk-Funktion
Diese benutzerdefinierten awk Funktion unterstützt alle Formate der
etime
Spalte (zB03-12:30:59
,00:07
etc.). Fügen Sie es einfach in Ihr awk-Skript ein, es ist eine einzeilige, benutzerfreundliche Lösung.sec(T)
konvertiert T in SekundenT
Zeitangabe im[[dd-]hh:]mm:ss
Format (zBetime
)C
Anzahl der Felder inT
(entspricht der NF-Variablen von awk)A
Array von Feldern inT
(entspricht awks $ -Variable)A[C>3?C-3:99]
Dies ist eine sichere Methode, um den vierten Wert (dh die Anzahl der Tage) in umgekehrter Reihenfolge zu referenzieren. Dieser Ansatz ist nützlich, da Tage und Stunden optional sind. Wenn das Array nicht lang genug ist, gibt es eine Dereferenzierung,A[99]
die einen0
Wert ergibt. Ich gehe davon99
aus, dass es für die meisten Anwendungsfälle hoch genug ist.Beispiel aus der realen Welt
Dieser Bash-Oneliner bricht den
soffice.bin
Prozess ab, der unter dem aktuellen Benutzer ausgeführt wird, wenn der Prozess älter als 180 Sekunden ist.quelle
Das
lstart
Feld inps
gibt ein konsistentes Zeitformat an, in das wirdate
seit der Epoche Daten einspeisen können , um sie in Sekunden zu konvertieren. Dann vergleichen wir das einfach mit der aktuellen Zeit.quelle
Ich habe die Antwort geändert, die sie dir im vorherigen Beitrag gegeben haben
Der reguläre Ausdruck sucht nach zwei Arten von zweiten Argumenten:
Hours:minutes:seconds
Ausdruck.Das sollte zu allem passen, außer zu jungen Prozessen, die die Form hätten
minutes:seconds
.quelle
Das ist wahrscheinlich übertrieben, aber ich wurde neugierig genug, um es zu beenden und zu testen, ob es funktioniert (natürlich mit einem anderen Prozessnamen auf meinem System). Sie können die Erfassung von
$user
und$pid
beenden, um die reguläre Ausdrucksweise zu vereinfachen, die ich nur zum Debuggen hinzugefügt habe und die keine Lust hatte, sie wieder zu entfernen. Benannte Captures von Perl 5.10 würden ein paar Zeilen mehr abschneiden, aber dies sollte auf älteren Perls funktionieren.Sie müssen den Ausdruck natürlich durch einen Kill ersetzen, aber ich wollte eigentlich nichts auf meinem eigenen System töten.
quelle
Ich habe einen Server mit falschen Daten in / proc und find funktioniert nicht. Deshalb habe ich folgendes Skript geschrieben:
quelle
Python-Version mit der Uhrzeit der Prozesseinträge in
/proc
:quelle
Ich benutze dieses einfache Skript, es dauert zwei Argumente Name des Prozesses und Alter in Sekunden.
quelle
das sollte funktionieren
killall --older-than 1h $proc_name
quelle
--older-than
und es ist leicht zu übersehen. Im Vergleich zu den anderen Antworten ist dies viel einfacher und jetzt auch auf EL7 verfügbar.Ich war mit der anderen Lösung nicht zufrieden, die meisten von ihnen sind zu kryptisch (mein Bash-Wissen ist irgendwie begrenzt) und daher kann ich sie nicht anpassen ...
Ich habe meine eigene Lösung erstellt. Es ist wahrscheinlich nicht die beste, aber es funktioniert und es ist lesbar
Sie können dieses Skript in einer Datei speichern und ausführbar machen (eventuell mit cron aufrufen)
quelle
72 = 3 Tage 48 = 2 Tage 24 = 1 Tag
Es klappt :)
quelle