Tout d'abord, oui, j'ai vu cette question:
Trouver (et tuer) d'anciens processus
Les réponses sont incorrectes et ne fonctionnent pas. J'ai voté et commenté en conséquence.
Les processus que je veux tuer ressemblent à ceci lorsqu'ils sont répertoriés avec 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 Sep09 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 15364 0,0 0,1 7004 3792? S Sep09 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 15397 0,0 0,1 6996 3788? S Sep09 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 16817 0,0 0,1 7000 3788? S Sep09 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 Sep09 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py
Je cherche à configurer un simple cron quotidien qui trouvera et tuera tous les page.py
processus de plus d'une heure.
La réponse acceptée à la question susmentionnée ne fonctionne pas, car elle ne correspond pas à une plage de temps, elle correspond simplement à des processus qui ont fonctionné de 7 jours à 7 jours 23 heures 59 minutes et 59 secondes. Je ne veux pas tuer les processus qui ont fonctionné depuis 1-2 heures, mais plutôt tout ce qui dépasse 1 heure.
L'autre réponse à la question susmentionnée en utilisant find
ne fonctionne pas, du moins pas sur Gentoo ou CentOS 5.4, elle crache un avertissement ou ne renvoie rien si l'avis de cet avertissement est suivi.
Grâce à la réponse de Christopher, j'ai pu l'adapter aux éléments suivants:
-mmin
était la commande de recherche qui me manquait.la source
find /proc -maxdepth 1 -type d -name 1 -mmin +60 -ls
- / sbin / init n'est pas répertorié malgré le nombre de temps de fonctionnement pour les jours, pas les heures. Il semble que vous ne puissiez pas compter sur l'heure de modification des répertoires de / proc /.find ne fonctionne pas toujours, tous les systèmes n'ont pas d'étimes disponibles, et cela pourrait être mon statut regex newb, mais je ne pense pas que vous ayez besoin de plus que cela:
vous pouvez ensuite canaliser cela pour tuer ou quel que soit votre besoin.
la source
ps
, mais je plierais les multiplesgrep
en un seulawk
, et pour des raisons de sécurité, limiter les correspondances de modèle à des colonnes particulières (pour exclure par exemple une correspondance de nom de commande constructeur, etc.)Si vous le souhaitez, vous pouvez vous alimenter
ps
avec une liste de PID à rechercher, par exemple:la source
etimes
fonctionne uniquement pour les plus récentsps
Je pense que vous pouvez modifier certaines de ces réponses précédentes pour répondre à vos besoins. À savoir:
Ou
Je pense que le second peut mieux répondre à vos besoins. La version find finirait par nuancer d'autres processus par cet utilisateur
--Christopher Karel
la source
kill -9
sauf en dernier recours. Utilisez-SIGINT
ou-SIGTERM
.ps
affichera l'heure au^..:..$
format lorsqu'elle est inférieure à une heure.la source
psmisc
utilitaire? L'OP a mentionné CentOS; est-il disponible en RPM?Le problème
Conversion de la
etime
colonne deps
commande (temps écoulé) en secondes. La spécification d'heure est dans ce format[[dd-]hh:]mm:ss
. Les versions plus récentes deps
ont uneetimes
colonne qui affiche laetime
valeur en secondes.La solution: simple fonction awk personnalisée
Cette fonction awk personnalisée prend en charge tous les formats de
etime
colonne (par exemple03-12:30:59
,00:07
etc.). Il suffit de le coller dans votre script awk, c'est une solution conviviale pour les lignes.sec(T)
convertit T en secondesT
spécification de l'heure au[[dd-]hh:]mm:ss
format (par exempleetime
)C
nombre de champs dansT
(équivalent à la variable NF de awk)A
tableau de champs dansT
(équivalent à la variable $ awk)A[C>3?C-3:99]
c'est un moyen sûr de référencer la quatrième valeur (c'est-à-dire le nombre de jours) dans l'ordre inverse. Cette approche est utile car les jours et les heures sont facultatifs. Si le tableau n'est pas assez long, il déréférencerA[99]
ce qui donnera de la0
valeur. Je suppose qu'il99
est suffisamment élevé pour la plupart des cas d'utilisation.Exemple du monde réel
Ce bash oneliner va tuer le
soffice.bin
processus en cours d'exécution sous l'utilisateur actuel si le processus est plus ancien que 180 secondes.la source
Le
lstart
champ dansps
donne un format d'heure cohérent que nous pouvons alimenterdate
pour convertir en secondes depuis l'époque. Ensuite, nous comparons simplement cela à l'heure actuelle.la source
J'ai modifié la réponse qu'ils vous ont donnée dans le post précédent
L'expression régulière recherche 2 types de second argument:
Hours:minutes:seconds
expression.Cela devrait correspondre à tout sauf aux jeunes processus qui auraient la forme
minutes:seconds
.la source
C'est probablement exagéré, mais je suis devenu assez curieux pour le terminer et tester qu'il fonctionne (sur un nom de processus différent sur mon système, bien sûr). Vous pouvez tuer la capture de
$user
et$pid
simplifier l'expression rationnelle, que j'ai seulement ajoutée pour le débogage, et je n'ai pas eu envie de revenir en arrière. Les captures nommées de perl 5.10 raseraient quelques lignes de plus, mais cela devrait fonctionner sur les anciennes perls.Vous devrez remplacer l'impression par un kill, bien sûr, mais je n'allais pas vraiment tuer quoi que ce soit sur mon propre système.
la source
J'ai un serveur avec des dates erronées dans / proc et find ne fonctionne pas, j'ai donc écrit ce script:
la source
Version Python utilisant le ctime des entrées de processus dans
/proc
:la source
J'utilise ce script simple il faut deux arguments nom du processus et âge en secondes.
la source
cela devrait fonctionner
killall --older-than 1h $proc_name
la source
--older-than
et il est facile de l'oublier. Comparé aux autres réponses, c'est beaucoup plus facile, et il est également disponible maintenant sur EL7.Je n'étais pas satisfait de l'autre solution, la plupart d'entre eux sont trop cryptiques (ma connaissance bash est un peu limitée) et donc je ne peux pas les personnaliser ...
J'ai créé ma propre solution, ce n'est probablement pas la meilleure mais ça marche et c'est lisible
Vous pouvez enregistrer ce script dans un fichier et le rendre exécutable (éventuellement l'appeler avec cron)
la source
72 = 3 jours 48 = 2 jours 24 = 1 jour
Ça marche :)
la source