67 votes

Comment retrouver l'âge d'un processus Linux de longue durée et le tuer?

J'ai un problème avec certains processus ressemblant à des zombies sur un certain serveur qui doivent être tués de temps en temps. Comment puis-je mieux identifier ceux qui ont duré plus d'une heure ou deux?

36voto

yukondude Points 8756

J'ai trouvé une réponse qui fonctionne pour moi:

avertissement: cela va trouver et tuer les processus longs en cours d'exécution

 ps -eo uid,pid,etime | egrep '^ *user-id' | egrep ' ([0-9]+-)?([0-9]{2}:?){3}' | awk '{print $2}' | xargs -I{} kill {}
 

(Où id-utilisateur est l' ID d' un utilisateur spécifique avec des processus de longue durée.)

La deuxième expression régulière correspond à une heure avec un nombre de jours optionnel, suivi d'une heure, d'une minute et d'une deuxième composante, et dure donc au moins une heure.

34voto

Jodie C Points 276

S'ils ont juste besoin d'être tués:

 if [[ "$(uname)" = "Linux" ]];then killall --older-than 1h someprocessname;fi
 

Si vous voulez voir à quoi ça correspond

 if [[ "$(uname)" = "Linux" ]];then killall -i --older-than 1h someprocessname;fi
 

Le drapeau -i vous demandera de répondre par oui ou par non à chaque correspondance de processus.

22voto

Mark Harrison Points 77152

Pour quelque chose de plus d'un jour,

ps aux

va vous donner la réponse, mais il descend à jour de précision qui pourrait ne pas être aussi utile.

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

Si vous êtes sous linux ou un autre système avec le système de fichiers /proc, Dans cet exemple, vous ne pouvez voir que le processus 1 a été en cours depuis le 22 juin, mais aucune indication du temps qu'il a commencé.


vous donnera une réponse précise. Pour exemple, voici un horodatage exact de processus 1, ps montre seulement que Jun22:

root         1  0.0  0.0   7200   308 ?        Ss   Jun22   0:02 init [5]

9voto

ggasp Points 608

De cette façon, vous pouvez obtenir la liste des dix processus les plus anciens:

 ps -elf | trier -r -k12 | tête -n 10 

7voto

Peter V. Mørch Points 1589

Proc :: ProcessTable de Perl fera l'affaire: http://search.cpan.org/dist/Proc-ProcessTable/

Vous pouvez l’installer dans Debian ou Ubuntu avec sudo apt-get install libproc-processtable-perl

Voici un one-liner:

 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" } }'
 

Ou, plus formaté, mettez ceci dans un fichier nommé 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";
    }
}
 

puis exécutez perl process.pl

Cela vous donne plus de polyvalence et une résolution de 1 seconde sur l'heure de début.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X