Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 ! big_smile
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... hmm

Je vous remercie d'avance pour votre aide ! smile
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 ! smile
Bien cordialement,

Hors ligne

#6 Le 13/03/2015, à 14:54

quaego

Re : Tuer des processus enfants après un certain temps

Seabirds a écrit :

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