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 27/07/2015, à 11:52

dva2tlse

[RéSOLU] Pourquoi ne vois-je pas les stdout des subprocess' enfants ?

Bonjour le forum,
Tout est dans la question; j'ai un problème autour duquel je tourne depuis quelques jours sans trouver d'issue.
J'ai un script qui lance NP instances d'un même programme TUV, dans $NP sous répertoires temporaires différents, avec des entrées différentes et dans des subprocess' différents.
Je voudrais pouvoir analyser après coup les stdout des différents subprocess.

Le script MTUV qui devrait faire cela, fait une boucle sur $NP. NP est une entrée en ligne de commande, le nombre de parts; FICRES est le nom du fichier de résultats, et FICINP sont les noms des fichiers d'entrée. (tout est déjà bien présent dans les répertoires TMP$I.

for I in seq(1 $NP)
do
    cd /S/SCRATCH/DVAtmp/TMP$I
    echo MTUV: Demarrage du TUV dans TMP$I par \"../TUV $I $FICRES $FICINP \&\" dans \$PWD=$PWD.
    echo "../TUV $I $FICRES $FICINP & :"
    2>&1 ../TUV $I $FICRES $FICINP & 
    echo
done

Je lance le script par "./MTUV NP FICRES FICINP" et je voudrais que les résultats de chacune des instances du programme qui tourne dans les différents subprocess' se voient en sortie pour pouvoir rediriger celle ci vers un fichier que j'analyserais plus tard.
Merci,
David

Dernière modification par dva2tlse (Le 29/07/2015, à 14:36)


xubuntu 22.04 dans un PC assemblé
PS: 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 contacter auparavant.

Hors ligne

#2 Le 27/07/2015, à 13:50

claudius01

Re : [RéSOLU] Pourquoi ne vois-je pas les stdout des subprocess' enfants ?

Bonjour dva2tlse et le forum ;-)

Je ne suis pas sûr de tout comprendre et donc je me permets 2 questions:

  1. Le process TUV1 écrit t-il sur stdout et/ou stderr en plus d'alimenter le fichier résultats $FICRES ?

  2. Ton souhait est-il de redigirer ce fichier résultats $FICRES vers stdout ?


Cdlt, A+
--
Claudius

Hors ligne

#3 Le 27/07/2015, à 14:22

dva2tlse

Re : [RéSOLU] Pourquoi ne vois-je pas les stdout des subprocess' enfants ?

Bonjour claudius01,
je voudrais simplement que les stdout et stderr de TUV aillent dans un autre fichier qui s’appelle tmp016Ti_3, à la suite des stdout et stderr de MTUV  qui est le père, et dont les TUV sont des enfants.

Je voudrais avoir : dans le répertoire supérieur :
-le script MTUV qui crée des subprocess où tournent les TUV, dans les sous répertoires TMPi.
-le fichier de contrôle, tmp016Ti_3, qui commence par les stdout et stderr de MTUV.

Puis après ses premières lignes qui fabriquent les données d'entrée pour les TUV dans les sous répertoires TMPi, MTUV forke les TUV chacun dans son propre sous répertoire TMPi, et je voudrais que les stdout et stderr des TUV aillent à la suite les uns des autres, dans le fichier de contrôle, tmp016Ti_3.


xubuntu 22.04 dans un PC assemblé
PS: 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 contacter auparavant.

Hors ligne

#4 Le 28/07/2015, à 15:41

claudius01

Re : [RéSOLU] Pourquoi ne vois-je pas les stdout des subprocess' enfants ?

Bonjour,

dva2tlse a écrit :

je voudrais simplement que les stdout et stderr de TUV aillent dans un autre fichier qui s’appelle tmp016Ti_3

Lancer la commande

$ 2>&1 MTUV ./output.txt ./input.txt | tee tmp016Ti_3

Pour le non entrelacement (stdout et stderr de MTUV qui est le père, et dont les TUV sont des enfants ... stdout et stderr des TUV aillent à la suite les uns des autres, dans le fichier de contrôle, tmp016Ti_3), cela ne sera possible qu'à la fin du traitement  ;-)

Edit: Je me suis permis de simuler les 2 process MTUV et TUV au moyen d'une implémentation en bash avec pour chacun une écriture sur stdout et stderr et que je tiens à ta disposition ;-)

Lancement de MTUV (sortie console + alimentation fichier 'tmp016Ti_3') qui montre l'entrelacement des sorties stdout et stderr qui sont normales car Unix (euh pardon Linux ;-) est multitâche (le fichier 'tmp016Ti_3' contient strictement la même chose que cette sortie console):

[claudius@CentOS-7 DVAtmp]$ 2>&1 ./MTUV result.txt | tee tmp016Ti_3
MTUV: 21:40:52,644: stdout: Starting (3 instances)...
MTUV: 21:40:52,647: stdout: Result file [result.txt]
MTUV: 21:40:52,650: stdout: Demarrage du TUV dans TMP1 par "../TUV 1 result.txt &" dans $PWD=/home/claudius/S/SCRATCH/DVAtmp/TMP1.
MTUV: 21:40:52,650: stdout: ../TUV 1 result.txt  & :
MTUV: 21:40:52,651: stderr: Simulate error to stderr
MTUV: 21:40:52,654: stdout: Child [24690] in progress ;-)
MTUV: 21:40:52,656: stdout: Demarrage du TUV dans TMP2 par "../TUV 2 result.txt &" dans $PWD=/home/claudius/S/SCRATCH/DVAtmp/TMP2.
TUV1: 21:40:52,657: stdout: Starting pid [24690] with duration [8 S]...
MTUV: 21:40:52,657: stdout: ../TUV 2 result.txt  & :
TUV1: 21:40:52,658: stdout: Result file [result.txt]
MTUV: 21:40:52,660: stderr: Simulate error to stderr
MTUV: 21:40:52,662: stdout: Child [24698] in progress ;-)
TUV2: 21:40:52,663: stdout: Starting pid [24698] with duration [7 S]...
MTUV: 21:40:52,663: stdout: Demarrage du TUV dans TMP3 par "../TUV 3 result.txt &" dans $PWD=/home/claudius/S/SCRATCH/DVAtmp/TMP3.
TUV2: 21:40:52,664: stdout: Result file [result.txt]
MTUV: 21:40:52,665: stdout: ../TUV 3 result.txt  & :
MTUV: 21:40:52,669: stderr: Simulate error to stderr
MTUV: 21:40:52,670: stdout: Child [24708] in progress ;-)
TUV3: 21:40:52,671: stdout: Starting pid [24708] with duration [1 S]...
MTUV: 21:40:52,672: stdout: List of 3 childs: [24690 24698 24708]
TUV3: 21:40:52,673: stdout: Result file [result.txt]
MTUV: 21:40:52,701: stderr: Child remaining [3]
TUV3: 21:40:53,675: stderr: Simulate an error to stderr
TUV3: 21:40:54,681: stdout: Leave pid [24708]
MTUV: 21:40:54,730: stderr: Child remaining [2]
MTUV: 21:40:56,756: stderr: Child remaining [2]
MTUV: 21:40:58,781: stderr: Child remaining [2]
TUV2: 21:40:59,668: stderr: Simulate an error to stderr
TUV1: 21:41:00,663: stderr: Simulate an error to stderr
TUV2: 21:41:00,671: stdout: Leave pid [24698]
MTUV: 21:41:00,809: stderr: Child remaining [1]
TUV1: 21:41:01,670: stdout: Leave pid [24690]
MTUV: 21:41:02,835: stderr: Child remaining [0]
MTUV: 21:41:02,837: stdout: All childs died ;-(
MTUV: 21:41:02,837: stdout: Leave.

Maintenant, ce que tu souhaites est sans doute ceci qui ne peut être fourni qu'à la fin de tous les traitements:
Fichier tmp016Ti_3 triée et non entrelacé:

[claudius@CentOS-7 DVAtmp]$ sort -k1 -k2 tmp016Ti_3
MTUV: 21:40:52,644: stdout: Starting (3 instances)...
MTUV: 21:40:52,647: stdout: Result file [result.txt]
MTUV: 21:40:52,650: stdout: Demarrage du TUV dans TMP1 par "../TUV 1 result.txt &" dans $PWD=/home/claudius/S/SCRATCH/DVAtmp/TMP1.
MTUV: 21:40:52,650: stdout: ../TUV 1 result.txt  & :
MTUV: 21:40:52,651: stderr: Simulate error to stderr
MTUV: 21:40:52,654: stdout: Child [24690] in progress ;-)
MTUV: 21:40:52,656: stdout: Demarrage du TUV dans TMP2 par "../TUV 2 result.txt &" dans $PWD=/home/claudius/S/SCRATCH/DVAtmp/TMP2.
MTUV: 21:40:52,657: stdout: ../TUV 2 result.txt  & :
MTUV: 21:40:52,660: stderr: Simulate error to stderr
MTUV: 21:40:52,662: stdout: Child [24698] in progress ;-)
MTUV: 21:40:52,663: stdout: Demarrage du TUV dans TMP3 par "../TUV 3 result.txt &" dans $PWD=/home/claudius/S/SCRATCH/DVAtmp/TMP3.
MTUV: 21:40:52,665: stdout: ../TUV 3 result.txt  & :
MTUV: 21:40:52,669: stderr: Simulate error to stderr
MTUV: 21:40:52,670: stdout: Child [24708] in progress ;-)
MTUV: 21:40:52,672: stdout: List of 3 childs: [24690 24698 24708]
MTUV: 21:40:52,701: stderr: Child remaining [3]
MTUV: 21:40:54,730: stderr: Child remaining [2]
MTUV: 21:40:56,756: stderr: Child remaining [2]
MTUV: 21:40:58,781: stderr: Child remaining [2]
MTUV: 21:41:00,809: stderr: Child remaining [1]
MTUV: 21:41:02,835: stderr: Child remaining [0]
MTUV: 21:41:02,837: stdout: All childs died ;-(
MTUV: 21:41:02,837: stdout: Leave.
TUV1: 21:40:52,657: stdout: Starting pid [24690] with duration [8 S]...
TUV1: 21:40:52,658: stdout: Result file [result.txt]
TUV1: 21:41:00,663: stderr: Simulate an error to stderr
TUV1: 21:41:01,670: stdout: Leave pid [24690]
TUV2: 21:40:52,663: stdout: Starting pid [24698] with duration [7 S]...
TUV2: 21:40:52,664: stdout: Result file [result.txt]
TUV2: 21:40:59,668: stderr: Simulate an error to stderr
TUV2: 21:41:00,671: stdout: Leave pid [24698]
TUV3: 21:40:52,671: stdout: Starting pid [24708] with duration [1 S]...
TUV3: 21:40:52,673: stdout: Result file [result.txt]
TUV3: 21:40:53,675: stderr: Simulate an error to stderr
TUV3: 21:40:54,681: stdout: Leave pid [24708]

L'environnement de test à l'image de tes répertoires:

[claudius@CentOS-7 DVAtmp]$ pwd
/home/claudius/S/SCRATCH/DVAtmp

[claudius@CentOS-7 DVAtmp]$ find . -type f
./TMP1/result.txt
./TMP2/result.txt
./TMP3/result.txt
./tmp016Ti_3
./MTUV
./TUV

[claudius@CentOS-7 DVAtmp]$ cat ./TMP?/*
TUV1: 21:41:00,665: stdout: [/home/claudius/S/SCRATCH/DVAtmp/TMP1]
TUV1: 21:41:00,666: stdout: Simulate a result
TUV2: 21:40:59,668: stdout: [/home/claudius/S/SCRATCH/DVAtmp/TMP2]
TUV2: 21:40:59,669: stdout: Simulate a result
TUV3: 21:40:53,677: stdout: [/home/claudius/S/SCRATCH/DVAtmp/TMP3]
TUV3: 21:40:53,679: stdout: Simulate a result

A suivre...

Dernière modification par claudius01 (Le 28/07/2015, à 22:46)

Hors ligne

#5 Le 29/07/2015, à 12:06

dva2tlse

Re : [RéSOLU] Pourquoi ne vois-je pas les stdout des subprocess' enfants ?

Oui Claudius01, tu as bien pigé ce que je voulais; et à un moment je l'avais eu déjà, mais chaipukoman, et ça s'empilait bien dans le fichier de contrôle, que je n'avais qu'à mettre à jour sans attendre la fin des process...
Mais pour l'instant ce qui me pose problème est une segfault que j'ai déjà mentionnée dans un des nombreux fils que j'ai ouverts pour essayer de tout bien comprendre.

Voici comment elle se produit :

MTUV: Lancements
MTUV: $NP=4 (Nb de Proc's voulu)
MTUV: Demarrage du TUV dans TMP1 par "(2>&1 ../TUV 1 p2srfdTiAB_4 elements-TiAB.inp)" dans $PWD=/S/SCRATCH/DVAtmp/TMP1.
10014    10712 10610  0 11:37 pts/6    00:00:00 ../TUV 1 p2srfdTiAB_4 elements-TiAB.inp
MTUV: Demarrage du TUV dans TMP2 par "(2>&1 ../TUV 2 p2srfdTiAB_4 elements-TiAB.inp)" dans $PWD=/S/SCRATCH/DVAtmp/TMP2.
10014    10712 10610  3 11:37 pts/6    00:00:00 ../TUV 1 p2srfdTiAB_4 elements-TiAB.inp
10014    10725 10610  0 11:37 pts/6    00:00:00 ../TUV 2 p2srfdTiAB_4 elements-TiAB.inp
MTUV: Demarrage du TUV dans TMP3 par "(2>&1 ../TUV 3 p2srfdTiAB_4 elements-TiAB.inp)" dans $PWD=/S/SCRATCH/DVAtmp/TMP3.
10014    10712 10610  5 11:37 pts/6    00:00:00 ../TUV 1 p2srfdTiAB_4 elements-TiAB.inp
10014    10725 10610  0 11:37 pts/6    00:00:00 ../TUV 2 p2srfdTiAB_4 elements-TiAB.inp
10014    10729 10610  0 11:37 pts/6    00:00:00 ../TUV 3 p2srfdTiAB_4 elements-TiAB.inp
MTUV: Demarrage du TUV dans TMP4 par "(2>&1 ../TUV 4 p2srfdTiAB_4 elements-TiAB.inp)" dans $PWD=/S/SCRATCH/DVAtmp/TMP4.
10014    10712 10610  6 11:37 pts/6    00:00:00 ../TUV 1 p2srfdTiAB_4 elements-TiAB.inp
10014    10725 10610  0 11:37 pts/6    00:00:00 ../TUV 2 p2srfdTiAB_4 elements-TiAB.inp
10014    10729 10610  0 11:37 pts/6    00:00:00 ../TUV 3 p2srfdTiAB_4 elements-TiAB.inp
10014    10733 10610  0 11:37 pts/6    00:00:00 ../TUV 4 p2srfdTiAB_4 elements-TiAB.inp
MTUV: ici fin Ok.
10014    10712 10610 10 11:37 pts/6    00:00:00 ../TUV 1 p2srfdTiAB_4 elements-TiAB.inp
10014    10725 10610  0 11:37 pts/6    00:00:00 ../TUV 2 p2srfdTiAB_4 elements-TiAB.inp
10014    10729 10610  0 11:37 pts/6    00:00:00 ../TUV 3 p2srfdTiAB_4 elements-TiAB.inp
10014    10733 10610  0 11:37 pts/6    00:00:00 ../TUV 4 p2srfdTiAB_4 elements-TiAB.inp
./MTUV: line 205: 10725 Segmentation fault      ../TUV $I $FICRES $FICINP 2>&1  (wd: /S/SCRATCH/DVAtmp/TMP2)
./MTUV: line 205: 10729 Segmentation fault      ../TUV $I $FICRES $FICINP 2>&1  (wd: /S/SCRATCH/DVAtmp/TMP3)
./MTUV: line 205: 10733 Segmentation fault      ../TUV $I $FICRES $FICINP 2>&1  (wd: /S/SCRATCH/DVAtmp/TMP4)
10014    10712 10610 78 11:37 pts/6    00:00:03 ../TUV 1 p2srfdTiAB_4 elements-TiAB.inp
10014    10712 10610 88 11:37 pts/6    00:00:06 ../TUV 1 p2srfdTiAB_4 elements-TiAB.inp
10014    10712 10610 92 11:37 pts/6    00:00:09 ../TUV 1 p2srfdTiAB_4 elements-TiAB.inp
10014    10712 10610 94 11:37 pts/6    00:00:12 ../TUV 1 p2srfdTiAB_4 elements-TiAB.inp

  Et après c'est bien la sortie du premier fils qui est le seul à avoir résisté.

p2srfd:00 Debut du programme, 11h 37mn  1s

p2srfd:00 Arg.1= :1:

p2srfd:01 Arg.2= :p2srfdTiAB_4:
p2srfd:01 Arg.3= :elements-TiAB.inp:
p2srfd:01 cmd=$ ./TUV 1 p2srfdTiAB_4 elements-TiAB.inp                                          
p2srfd:01  C= 1 (arg.1 Ok)
p2srfd:01  FICINP=elements-TiAB.inp                                                               
p2srfd:01  FICRES0=p2srfdTiAB_4                                                                    
p2srfd:01  FICRES(0)=p2srfdTiAB_4.out                                                                
p2srfd:01 Juste avant l'appel de lecelt; C= 1, D=0, U=0

Et ça va bien jusqu'à la fin :

tesent:01 debut de tesent; C= 1, D=0, U=0, trim(FICRES(U))=p2srfdTiAB_4.out
tesent:01 trim(string0)= :[ $(ps -fu $USER|grep ./TUV|grep -v grep|wc -l) -gt 1 ]:
tesent:01 status0=256, status0.ne.0 <=> derniere instance et il faut finir ici. 11h 37mn 30s

tesent:01 echo \$\ $(date) 5999 C=1 \$\(date\)  \(-\> stdout der depuis tesent\)
tesent:01 trim(string1)= :echo \$\ $(date) 6999 C=1 >> ../p2srfdTiAB_4.out:
tesent:01 trim(string3)= :[ $(grep "6999 C" ../p2srfdTiAB_4.out|wc -l) -gt 0 ]: -> status3= 000

 scp ispc1212:/S/SCRATCH/DVAtmp/p2srfdTiAB_4.out ispc1214:/S/SCRATCH/dva

 ls -lrt *TiAB_4*
 ls -lrt *TiAB_4*.out
 more *TiAB_4*.out
 cat *TiAB_4*.out
 ls -lrt FEM/p2srfd.*

p2srfd:01 Fin

Maintenant, tout ce que je sais faire avec ça, est d'utiliser le "bt" (backtrace) de gdb, et ça va être coton d'arriver à m'en servir sur le premier des fils qui plantent.
M'enfin bon je te tiendrais un peu au courant par mes questions éventuelles, puisque j'en ai encore jusqu'à la fin de la semaine avant mes ouacances. (bien méritées évidemment)
David


xubuntu 22.04 dans un PC assemblé
PS: 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 contacter auparavant.

Hors ligne

#6 Le 29/07/2015, à 14:26

claudius01

Re : [RéSOLU] Pourquoi ne vois-je pas les stdout des subprocess' enfants ?

Bonjour dva2tlse et le forum,

Je compatis et j'ai souvenir que ton programme écrit en Fortran avait des sautes d'humeur...
Je ne sais plus si la communauté t'avait aiguillé sur Valgrind qui supporte parfaitement l'analyse de code écrit en Fortran et notamment si gfortran est employé.


Bon courage et bonnes vacances, A+
--
Claudius

Dernière modification par claudius01 (Le 29/07/2015, à 14:27)

Hors ligne

#7 Le 29/07/2015, à 14:33

dva2tlse

Re : [RéSOLU] Pourquoi ne vois-je pas les stdout des subprocess' enfants ?

Le "gdb" me dit exactement quelle instruction de mon fortran fait planter le programme, [.../...] et je viens de comprendre pourquoi; c'est un test que j'avais prévu pour les deux faces d'une plaque, et quand on travaille sur une barre qui n'a pas de face, le test pédale et sort un status non nul, et le sous programme qui est censé afficher le "status" résultant du test fait une segfault pour je-ne-sais quelle raison; mais ce n'est plus ce qui m'importe maintenant que j'ai trouvé la cause initiale.
Bonne continuation et merci de m'avoir aidé en suivant l'affaire,
David


xubuntu 22.04 dans un PC assemblé
PS: 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 contacter auparavant.

Hors ligne