69 Stimmen

Wie kann man alle Linux-Prozesse, die älter als ein bestimmtes Alter sind, beenden?

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?

7voto

Peter V. Mørch Punkte 11308

Perl's Proc::ProcessTable wird den Zweck erfüllen: http://search.cpan.org/dist/Proc-ProcessTable/

Sie können es in Debian oder Ubuntu installieren mit sudo apt-get install libproc-processtable-perl

Hier ist ein Einzeiler:

perl -MProc::ProcessTable -Mstrict -w -e 'my $anHourAgo = time-60*60; my $t = new Proc::ProcessTable;foreach my $p ( @{$t->table} ) { if ($p->start() < $anHourAgo) { print $p->pid, "\n" } }'

Oder, etwas formatierter, in eine Datei namens process.pl:

#!/usr/bin/perl -w
use strict;
use Proc::ProcessTable;
my $anHourAgo = time-60*60;
my $t = new Proc::ProcessTable;
foreach my $p ( @{$t->table} ) {
    if ($p->start() < $anHourAgo) {
        print $p->pid, "\n";
    }
}

dann laufen perl process.pl

Dies bietet Ihnen mehr Vielseitigkeit und eine 1-Sekunden-Auflösung bei der Startzeit.

3voto

Sie können verwenden bc um die beiden Befehle in der Antwort von mob zu verbinden und zu erfahren, wie viele Sekunden seit Beginn des Prozesses verstrichen sind:

echo `date +%s` - `stat -t /proc/<pid> | awk '{print $14}'` | bc

bearbeiten:

Aus Langeweile, während ich darauf wartete, dass lange Prozesse ablaufen, kam nach ein paar Minuten Tüftelei das folgende Ergebnis heraus:

#file: sincetime
#!/bin/bash
init=`stat -t /proc/$1 | awk '{print $14}'`
curr=`date +%s`
seconds=`echo $curr - $init| bc`
name=`cat /proc/$1/cmdline`
echo $name $seconds

Wenn du das auf deinen Weg legst und es so nennst: sincetime

wird die cmd-Zeile des Prozesses und die Sekunden seit dem Start ausgegeben. Sie können dies auch in Ihren Pfad einfügen:

#file: greptime
#!/bin/bash
pidlist=`ps ax | grep -i -E $1 | grep -v grep | awk '{print $1}' | grep -v PID | xargs echo`
for pid in $pidlist; do
    sincetime $pid
done

Und dann, wenn Sie laufen:

greptime <pattern>

wobei patterns eine Zeichenkette oder ein erweiterter regulärer Ausdruck ist, werden alle Prozesse, die diesem Muster entsprechen, und die Sekunden seit ihrem Start ausgegeben :)

2voto

Maniraj Patri Punkte 21

Eine ps -aef . Dies zeigt Ihnen die Zeit an, zu der der Prozess begann. Verwenden Sie dann die date Befehl die aktuelle Uhrzeit. Berechnen Sie die Differenz zwischen den beiden, um das Alter des Prozesses zu ermitteln.

1voto

Rodney Amato Punkte 1228

Ich habe etwas Ähnliches wie die akzeptierte Antwort getan, aber etwas anders, da ich auf der Grundlage des Prozessnamens und des fehlerhaften Prozesses, der länger als 100 Sekunden läuft, einen Abgleich vornehmen möchte

kill $(ps -o pid,bsdtime -p $(pgrep bad_process) | awk '{ if ($RN > 1 && $2 > 100) { print $1; }}')

1voto

mob Punkte 113680

stat -t /proc/<pid> | awk '{print $14}'

um die Startzeit des Prozesses in Sekunden seit der Epoche zu ermitteln. Vergleichen Sie mit der aktuellen Zeit ( date +%s ), um das aktuelle Alter des Prozesses zu ermitteln.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X