#1 Le 11/03/2015, à 12:12
- Seabirds
Tuer des processus enfants après un certain temps
Bonjour tout le monde !
Je suis pas tout à fait nouveau sur bash, mais clairement j'atteinds vite mes limites dès qu'on sort des commandes de base !
J'ai lancé un processus parent sur un serveur, qui lance plusieurs sous-processus en parallèle. Certains sous-processus terminent rapidement (de l'ordre de la minute), mais d'autre sont extrêmement long (15 heures... o-O).
Je voudrais killer les sous-processus dont le temps d'exécution est supérieur à 60 minutes (et pas le processus parent). Comment faire ?
J'imagine qu'avec la commande ps ou top on peut récupérer le PID des processus dont le time est supérieur à 60. Mais je ne sais pas comment l'écrire en bash. Et avec ps -ejH j'imagine qu'on peut disitnguer le processus parent des processus enfants, mais là encore pour l'écrire...
Je vous remercie d'avance pour votre aide !
Cordialement,
Hors ligne
#2 Le 11/03/2015, à 13:12
- Braun
Re : Tuer des processus enfants après un certain temps
Bonjour,
Comment sera démarré ton script ?
Hors ligne
#3 Le 11/03/2015, à 14:50
- Seabirds
Re : Tuer des processus enfants après un certain temps
Bonjour !
Mon script est lancé par le logiciel R (pour ceux qui connaissent...). Je viens d'insérer une commande interne au code qui permet de fixer une durée limite d'exécution. Donc ce souci là est réglé, mais j'aimerais par souci didactique (c'est toujours bon à savoir) savoir tout de même comment killer conditionnellement à un paramètre du process.
Si l'idée de la question de Braun était de me faire amorcer une ébauche de code bash, soit, je me lance, mais... hum, je suis très limité !
Pour faire l'association entre pid et le temps écoulé :
ps -eo pid,etime
On peut peut stocker cette matrice dans une variable, et sélectionner seulement les lignes pour lesquelles la deuxième colonne est supérieure à 3600 ? En langage R, c'ets faisable avec
which(mat[,2]>3600)
. Mais ça je sais pas faire en bash ! J'ai vu des gens écrire la sortie de ps vers un fichier texte, et le balayer à coup de grep... ça je peux essayer de le faire...
ps -eo pid,etime > file.txt
Mais pour le grep, là je suis largué !
Cordialement,
Hors ligne
#4 Le 11/03/2015, à 15:33
- Braun
Re : Tuer des processus enfants après un certain temps
Donc, si je comprends bien tu veux lancer ton programme une seule fois manuellement et à une date donnée. Je ne vois, pas le détail mais je pense que l'idée est d'isoler et stocker les dates ou les durées des processus en cause et de les placer dans une variable ...
Hors ligne
#5 Le 13/03/2015, à 12:06
- Seabirds
Re : Tuer des processus enfants après un certain temps
Oui, c'est bien ça !
Je vais essayer de les stocker dans un fichier texte, je verrai après avec un awk... Si je trouve je poste mes bouts de code !
Bien cordialement,
Hors ligne
#6 Le 13/03/2015, à 14:54
- quaego
Re : Tuer des processus enfants après un certain temps
Pour faire l'association entre pid et le temps écoulé :
ps -eo pid,etime
On peut peut stocker cette matrice dans une variable, et sélectionner seulement les lignes pour lesquelles la deuxième colonne est supérieure à 3600 ? En langage R, c'ets faisable avec
which(mat[,2]>3600)
. Mais ça je sais pas faire en bash ! J'ai vu des gens écrire la sortie de ps vers un fichier texte, et le balayer à coup de grep... ça je peux essayer de le faire...
Bonjour,
ps -eo pid,etimes | grep -v "PID" | awk '{ if ($2 > 3600) print $1 }'
ps avec etimes (avec un "s" pour l'avoir en secondes), le grep -v "PID" pour supprimer la ligne d'entête, et le awk pour afficher la première "colonne" ($1) si la deuxième ($2) est supérieure à 3600.
Hors ligne