Ordre traitement des processus script shell

Résolu
teab -  
 teab - 1 juin 2010 à 13:37
Bonjour,

J'ai un script shell qui lance un noyau de calcul exterieur au script.
Allure du script

commande 0

/noyaudecalcul

commande 1

Ma question est la suivante: pour executer la commande 1, le script attend-il vraiment que l'éxecution du noyau de calcul soit terminée?

Une seconde question :
Comment puis-je stopper prematurement l'execution du noyau de calcul (si celle-ci depasse 10 secondes par exemple).

Merci d'avance à tous!
teab

A voir également:

3 réponses

jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Salut,

Question 1 : Oui

Question 2 : Tu lances la commande précédente en arrière-plan (commande &) et tu intercales un "sleep 10", puis tu vérifies que le job de la commande en arrière-plan ($!) n'est plus présent...
0
teab
 
question 1: merci

question 2: si j'ai bien compris, ca donne ça?

commande 0

/noyaudecalcul &
sleep 10

commande 1
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
commande 0

/noyaudecalcul &
sleep 10

kill %1      # pour tuer le job en arrière-plan

commande 1
0
teab
 
d'accord!
Alors en fait je n'ai pas été assez précis dans ma demande.
Normalement le noyau de calculs met 1/2 seconde à peu près. Sauf qu'avec cette méthode même s'il a finit, on doit attendre 10 secondes avant de passer à la commande suivante.
Je voudrais que si le temps mis pour l'execution du noyau de calculs est supérieur à 10 secondes le processus soit interrompu sinon on passe directement à la commande suivante dès que le noyau à terminer.

Une idée?
0
dubcek Messages postés 18788 Date d'inscription   Statut Contributeur Dernière intervention   5 632
 
hello
/noyaudecalcul &
PID=$!
(sleep 10 ; pgrep -l noyaudecalcul | grep -q $PID &&  kill $PID )&
wait $PID 
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Salut dubcek,

Normalement le noyau de calculs met 1/2 seconde à peu près. Sauf qu'avec cette méthode même s'il a finit, on doit attendre 10 secondes avant de passer à la commande suivante.

Ça ne change rien au problème et je ne pense pas qu'il soit possible de mettre en oeuvre ce que demande teab avec un job en arrière plan et la commande wait ;-((
0
dubcek Messages postés 18788 Date d'inscription   Statut Contributeur Dernière intervention   5 632
 
le sleep est en arrière plan, le wait va n'attendre qu'1/2 sec. et si il attend plus de 10 secs le kill va tuer PID et le wait se terminer
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Arf, désolé, j'avais pas fait gaffe au sous-shell, je m'étais focalisé que sur le "sleep" ;-((

Toutes mes plates ;-)
0
teab
 
Bonjour !
Primo, merci! Je n'ai pas encore eu le temps de tester cette solution.
J'aimerai etre sur d'avoir compris.

/noyaudecalcul & ==> lancement en tache de fond
PID=$! ==> ??
(sleep 10 ; pgrep -l noyaudecalcul | grep -q $PID && kill $PID )& ==> en tache de fond: attente de 10s, recuperation du PID du noyaudecalcul et kill du processus
wait $PID

En fait j'ai un doute sur l'insertion de ce code dans une boucle for.
Car imaginons que la boucle est à l'indice i et que le calcul se fasse en 1/2s. Il ne faut pas que la tache de fond (sleep....) kill le processus de la boucle i+1.
Mon explication n'est peut être pas très clair mais j'ai du mal à cerner la difficulté.

Qu'en pensez-vous?
0