Trouver (et tuer) d'anciens processus

10

Fondamentalement, je dois être en mesure d'analyser l'arborescence des processus et de trouver des processus qui correspondent à un certain nom et j'ai commencé à exécuter plus d'une semaine. Une fois que je les ai, je dois les tuer. Tous les processus sont toujours considérés comme étant dans un état en cours d'exécution par le système, n'utilisant simplement aucune heure système. Ils resteront généralement éternels dans cet état aussi.

Idéalement, j'aimerais trouver quelque chose de similaire, mais pour les processus.

Le système est Linux Debian et ce sera scripté et exécuté par cron donc je n'ai pas de vrai problème avec quelque chose de grand mais compréhensible.

Ryaner
la source
4
comment allez-vous faire la différence entre des processus anciens mais importants et ceux que vous êtes heureux de tuer?
Chopper3

Réponses:

9

Vous pouvez le faire avec une combinaison de ps, awk et kill:

ps -eo pid,etime,comm

Vous donne une sortie à trois colonnes, avec le PID du processus, le temps écoulé depuis le démarrage du processus et le nom de la commande, sans arguments. Le temps écoulé ressemble à l'un d'eux:

mm:ss
hh:mm:ss
d-hh:mm:ss

Puisque vous voulez des processus qui s'exécutent depuis plus d'une semaine, vous devriez rechercher des lignes correspondant à ce troisième modèle. Vous pouvez utiliser awk pour filtrer les processus en exécutant le temps et le nom de la commande, comme ceci:

ps -eo pid,etime,comm | awk '$2~/^7-/ && $3~/mycommand/ { print $1 }'

qui affichera les pids de toutes les commandes correspondant à 'mycommand' qui fonctionnent depuis plus de 7 jours. Canalisez cette liste en kill, et vous avez terminé:

ps -eo pid,etime,comm | awk '$2~/^7-/ && $3~/mycommand/ { print $1 }' | kill -9
Ian Clelland
la source
Bien merci. J'ai complètement oublié les options de formatage dans ps.
Ryaner
2
Cela ne vous montre pas les processus exécutés "plus de 7 jours". Il vous montre les processus en cours d'exécution entre 7 jours mais moins de 8 jours.
hobodave du
etimesest plus pratique - serverfault.com/a/393476/67675
poige
4

killall --quiet --older-than 1w process_name

billyw
la source
1
Cela fonctionne très bien sur Ubuntu 16.04 et vous pouvez l'utiliser avec le drapeau -i (interactif) pour tester et vous assurer qu'il cible les processus que vous pensez qu'il devrait être.
ezwrighter
1

Toutes les informations dont vous avez besoin peuvent être récupérées ps -ef. Voir la colonne "STIME". Combinez cela avec greppour trier les processus dont vous avez besoin. À ce stade, vous pouvez utiliser cutpour saisir le pid de tous les processus correspondants et les transmettre à kill.

Veuillez me faire savoir si vous souhaitez plus de détails sur la façon de procéder.

EEAA
la source
Je voudrais plus de détails. Les autres réponses sont tout simplement incorrectes.
hobodave
1

si vous êtes root, pour vous débarrasser de la corbeille (/ proc / fs proc / stat ...)

find /proc -maxdepth 1 -regex '/proc/[0-9]*' -type d -mtime +2 -exec basename {} \;

la source
0

Lorsqu'un processus démarre, il crée un répertoire dans le système de fichiers / proc. Vous pouvez utiliser la commande find pour obtenir des répertoires de plus de 7 jours et tuer les processus comme suit:

find /proc -user myuser -maxdepth 1 -type d -mtime +7 -exec basename {} \; | xargs kill -9 
dogbane
la source
Cela ne fonctionne pas non plus. En l'état, il génère cet avertissement, et aucune sortie supplémentaire: en find: warning: you have specified the -maxdepth option after a non-option argument -user, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it). Please specify options before other arguments.déplaçant -maxdepth pour être la première sortie, il ne renvoie aucun processus, et je suis certain que beaucoup doivent correspondre.
hobodave
aussi pourquoi mtime pas ctime si vous cherchez la date de création du dir? le dir pourrait théoriquement être modifié si un enfant supplémentaire était créé, ce que je n'exclurais pas (peut-être qu'un module de noyau nouvellement chargé étendrait sysfs d'une manière ou d'une autre)
jmtd
0

Personne n'a mentionné ps-watcher ici. Je pense que vous pourriez comparer $ start_time en utilisant la fonction elapsed2sec mais je ne suis pas tout à fait sûr. Voici ma première pensée:

[myproc]
occurs = every
trigger = elapsed2secs('$start_time') > 7*DAYS
action = <<EOT
  echo "$command has been running more than 7 days" | /bin/mail user\@host
  kill -TERM $pid
EOT

aucune idée si cela fonctionne, mais cela devrait être un bon point de départ.

Phil Hollenback
la source