IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

stdout, stderr et subprocess


Sujet :

Shell et commandes GNU

  1. #1
    Membre habitué
    Homme Profil pro
    ingénieur calcul
    Inscrit en
    Décembre 2007
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur calcul
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 363
    Points : 180
    Points
    180
    Par défaut stdout, stderr et subprocess
    Bonjour,
    je voudrais faire un script, en ksh ou bash je ne sais pas encore, pour exécuter plusieurs instances d'un même programme mais avec des entrés différentes, et dans des subprocess différents eux aussi. Je voudrais que toutes les sorties standard soient répercutées sur l'entrée standard du script, pour rediriger la sortie standard de celui ci vers un fichier que je pourrais consulter utérieurement.
    J'aimerais bien aussi que les canaux stderr soient utilsables aussi puisque je suis en phase de développement du programme qui tourne dans les subprocess.

    Pour l'instant, j'ai une boucle sur le nombre de subprocess voulus, NP, qui est passé en argument 1 au script, et chaque subprocess devrait tourner le programme avec un fichier de résultats FICRES en argument 2 et un fichier d'entrées FICINP en argument 3 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    echo
    echo MTUVB: Debut... date=$(date)
    echo
    NP=$1
    FICRES=$2
    FICINP=$3
    #
    for I in $(seq 1 $NP) 
    do
        cd /S/SCRATCH/DVAtmp/TMP$I
        echo MTUVB: Demarrage du TUVB dans TMP$I par \"\(../TUVB $I $FICRES $FICINP\) \&\" dans \$PWD=$PWD.
        echo
        (../TUVB $I $FICRES $FICINP) &
    done
    echo MTUVB: Fin.
    echo
    exit
    Je le lance par "./MTUVB 3 p2srfd016Ti_3 el016Ti.inp >tmp016Ti_3B", mais le fichier tmp016Ti_3B vers lequel est redirigée la sortie standard du script ne contient que les sortie stanard du script, mais pas de ses subprocess' alors que c'est ce qui m'intéresse le plus.
    Merci de m"aider; ça ne doit pas être bien compiqué mais ça fait pas mal de temps que je tourne autour sans trouver.
    David
    P.S. Dis Toto, pourquoi l'univers existe-t'il ?
    Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se causer avant.

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par dva2tlse Voir le message
    Je le lance par "./MTUVB 3 p2srfd016Ti_3 el016Ti.inp >tmp016Ti_3B
    Bonjour

    Le pb c'est que ton process père écrit dans tmp016Ti_3B en mode "écrasement". Donc les fils lancés en arrière-plan écrivent aussi dans le fichier mais comme ils sont justement lancés en arrière-plan, le père ne les attend pas et continue à écrire lui-aussi et écrase ce que les fils y ont mis.

    Te suffit donc de demander un mode "append" et non "écrasement" => ./MTUVB 3 p2srfd016Ti_3 el016Ti.inp >>tmp016Ti_3B...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre habitué
    Homme Profil pro
    ingénieur calcul
    Inscrit en
    Décembre 2007
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur calcul
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 363
    Points : 180
    Points
    180
    Par défaut Merci
    merci d'avoir remarqué cela; j'en ai honte tellement c'est une erreur "de base", mais cela n'explique toutefois pas pourquoi je n'ai pas les résultats de la dernière instance qui a tourné, celle en I=3 si toutefois rien d'autre ne vient perturber cet ordre de base.
    Mébon merci encore, j'essaierai ça lundi, puisque là, je suis rentré chez ma maison pour un ouikend coolos.
    Bon week end à toi aussi,
    David
    P.S. Dis Toto, pourquoi l'univers existe-t'il ?
    Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se causer avant.

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par dva2tlse Voir le message
    mais cela n'explique toutefois pas pourquoi je n'ai pas les résultats de la dernière instance qui a tourné, celle en I=3 si toutefois rien d'autre ne vient perturber cet ordre de base.
    Je sais pas trop - Surtout que j'ai écrit de mon coté un petit code de test
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/bin/sh
     
    for i in $(seq 3); do
    	./sp.sh $i &
    done
    sleep 1
    echo "fin"

    Et le contenu du "sp.sh"
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #!/bin/sh
     
    echo ok $1

    Je le lance de cette façon: ./essai.sh >res et j'ai bien dans mon fichier "res" les lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ok 1 (ou 2 ou 3 ça dépend)
    fin
    Donc je pense avoir fait une petite erreur d'analyse car ce n'est pas le père qui écrase le fichier mais chacun des 3 fils (et forcément c'est le dernier qui gagne). Et donc comme tu le dis, on doit au-moins avoir une des 3 instances (toutefois rien ne permet de prédire laquelle) dans le fichier de sortie.

    Toutefois cela fait partie des trucs sur lesquels je ne me suis jamais penché et qui ne m'empêcheront pas de dormir...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 287
    Points : 12 744
    Points
    12 744
    Par défaut
    Bonjour,

    Le problème c'est que le processus père fini avant que ton dernier process en arrière plan soit complètement initialisé et n'hérite pas du stdout du père puisque celui-ci est déjà mort.
    il faudrait qu'après ta boucle for (donc juste après le done), que tu attends la fin des process en arrière plan. Sous bash, tu as la commande wait pour cela.
    Cordialement.

  6. #6
    Membre habitué
    Homme Profil pro
    ingénieur calcul
    Inscrit en
    Décembre 2007
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur calcul
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 363
    Points : 180
    Points
    180
    Par défaut
    Oui, c'est bien ça; le père finit "trop" tôt. En effet, j'avais même fait un test avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if [ $(ps -fu $USER|grep ./TUV|grep -v grep|wc -l) -eq 1 ]; then echo MTUV: Ok 1 instance; fi
    Et ça me permet de voir ce que tu dis.
    mais en mettant un "wait" après le "done", qui devrait faire attendre gentiment la fin des subprocess' lancés dans la boucle, j'obtiens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./MTUV: line 220: 30762 Segmentation fault      ./TUV $I $FICRES $FICINP 2>&1  (wd: /S/SCRATCH/DVAtmp/TMP2)
    (cela se passe au deuxième tour puisqu'on en est au répertoire "TMP2")

    Mais d'où peut bien venir cette segfault ? La ligne 220 du script est bien celle d'où est lancé le subprocess.
    David
    P.S. Dis Toto, pourquoi l'univers existe-t'il ?
    Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se causer avant.

Discussions similaires

  1. Gestion de stdout, stderr par gtk
    Par KiKiTiTi dans le forum GTK+ avec C & C++
    Réponses: 6
    Dernier message: 11/12/2008, 01h11
  2. redéfinir dans un script ses stdout/stderr
    Par _Remy_ dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 09/10/2008, 23h07
  3. Lecture Asynchrone STDOUT & STDERR
    Par ecatum dans le forum Langage
    Réponses: 3
    Dernier message: 04/04/2007, 17h50
  4. [wxPython] redirection des commentaires stderr/stdout
    Par Guigui_ dans le forum wxPython
    Réponses: 5
    Dernier message: 28/12/2005, 22h58
  5. [Runtime][exec]Récupérer les stdout ET stderr
    Par yveslamand dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 20/05/2005, 13h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo