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?
Réponses
Trop de publicités?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.
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.
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]
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.