#!/bin/csh ####################################################################################################################################### # # # E X E C U T I O N D ' U N E C O M M A N D E S U R U N E L I S T E # # D E F I C H I E R D E P O S T F I X E D O N N E # # A L ' E X C L U S I O N D E C E Q U I R E S I D E R A I T D A N S ' $xTG ' : # # # # # # Utilisation : # # # # $xcg/FindExec.01$Z AbortFindExec [<Commandes>] # # $xcg/FindExec.01$Z <directory> <postfixe> "<ComS>[,<ComP>[,<ComV>]]" [<exclusions> [<arguments> [<ListeFichierA>]]] # # # # en materialisant par '"$K_VIDE"' les arguments # # absents lorsque '$ListeFichierA' est present et # # que le tout est execute via un 'job'... # # # # # # Blocage/Deblocage (en cours d'execution) par : # # # # BloqueP $xcg/FindExec.01$Z # # DBloqueP $xcg/FindExec.01$Z # # # # mais ATTENTION, ne fonctionne pas en mode "Parallele 'Linda'" ; dans ce cas, # # quelque chose de plus specifique existe et le "mode d'emploi" est alors edite, # # sachant qu'il y a autant de {BloqueP,DBloqueP}s que de branches paralleles # # possibles (2, 4,...). # # # # Mais ATTENTION alors au cas ou les commandes sont executees par # # paquets ('v $xcs/Linda$vv$Z TaillePaquets') ; il peut alors etre # # necessaire d'attendre longtemps avant le blocage effectif : c'est en # # particulier le cas avec les 'Gserveur's... # # # # # # Variables ('setenv') de controle : # # # # SFindExec [=$EXIST] : Forcer la definition d'alias et de variables "complementaires". # # # # FindExec_InverserOrdre [=$NEXIST] : Inverser l'ordre de traitement des commandes. # # # # FindExec_MessagesBP [=$EXIST] : Editer les messages relatifs aux Branches Paralleles. # # # # FindExec_Editer [=$NEXIST] : Editer le mode (parallele ou sequentiel utilise), # # FindExec_Parallele [=$EXIST] : Autoriser le mode parallele (mode par defaut), # # FindExec_ParalleleLinda [=$EXIST] : En cas de mode parallele, utiliser le mode 'Linda'. # # # # ProcessorNumber [=Nombre] : Nombre de processeurs utilisables. # # # # # # Author of '$xcg/FindExec.01$Z' : # # # # Jean-Francois COLONNA (LACTAMME, AAAAMMJJhhmmss). # # # ####################################################################################################################################### set DiReCtOrY=$1 set PoStFiXe=$2 set CoMmAnDe="$3" # La mise entre '$K_QD' a ete introduite le 20030514174020 afin de pouvoir utiliser des # # commandes avec des arguments ('v $xcg/GENERE$EXT$Z FindExec.01.Z' par exemple...). # set ExClUsIoNs="$4" # La liste d'exclusion s'utilisera eventuellement de la facon suivante : # # # # $xcg/FindExec.01$Z <directory> <postfixe> <commande> "! -name NOM1 ! -name NOM2 ..." # # # # ce qui eliminera les noms 'NOM1', 'NOM2',... # # # # A compter du 20090207113437, afin de resoudre le probleme de la parallelisation (au passage # # impossible) de la compilation des '$K' de '$xcp' ('v $xcc/RecompileAll$Z 20090207113809), # # la liste d'exclusion s'utilisera de la facon plus naturelle suivante : # # # # $xcg/FindExec.01$Z <directory> <postfixe> <commande> "NOM1 NOM2 ..." # # # # ce qui eliminera les noms 'NOM1', 'NOM2',... # set ArGuMeNtS="$5" # Liste d'arguments a communiquer eventuellement "au bout" de la commande '$CoMmAnDe'. Ceci # # a ete introduit le 20041025141201 pour utiliser 'v $xcc/RecompileAll$Z 20041025144750', # # par exemple, de facon selective en ne recompilant que les '$K' qui sont du type # # 'PRAGMA_CL_____PAS_DE_LIBRAIRIES_DYNAMIQUES'... # set ListeFichierA=$6 # Pour pouvoir recuperer une liste anterieure '$ListeFichier' (introduit le 20090615143636), # # mais evidemment cela n'a de sens que si 'v $xcs/Linda$vv$Z' est utilise, puisque dans ce # # cas le fichier '$ListeFichier' est progressivement "amaigri", les commandes executees # # y etant supprimees (on suppose evidemment que le 'v $xcs/Linda$vv$Z' anterieur a ete # # interrompu proprement, c'est-a-dire en utilisant 'BloqueP'...). # # # # ATTENTION, si '$xcg/FindExec.01$Z' est execute via un 'job' et si l'un des arguments (ou # # les deux...) '$ExClUsIoNs' et '$ArGuMeNtS' sont vides, alors ils doivent etre materialises # # par '"$K_VIDE"', c'est-a-dire ainsi : # # # # job $xcg/FindExec.01$Z DiReC PoSt CoMm '"$K_VIDE"' '"$K_VIDE"' ListeFichierA # # # # lorsque '$ListeFichierA' est present... # if ("$DiReCtOrY" == "AbortFindExec") then pause "Est-ce bien necessaire d'aborter tous les process de '"'$xcg/FindExec.01$Z'"' sur '$sHOTEex' ?" pause "Faire tous les 'BloqueP's utiles a bloquer tous les processus et attendre que cela soit effectif." pause "Est-ce toujours d'accord pour aborter tous les process de '"'$xcg/FindExec.01$Z'"' sur '$sHOTEex' ?" set Commandes="$PoStFiXe" # Introduit le 20131128145729... # (Ps) | \ $EGRE "FindExec.01$Z|Linda$vv$Z|parallele.1N$X$Commandes" | \ $AW ' { print "'"($KILL -$aborte"' " $4 "'") >& $nul"'" } ' | \ $GRE -v " $$)" | \ $CSH -s # On notera la mise entre parentheses du '$KILL' afin que le '$CSH' ne rende pas la main # # des qu'un : # # # # nnnnn: No such process # # # # est rencontre... # # # # Le 20131127174432 j'ai supprime le '$xcg/FindExec.01$Z' courant (c'est-a-dire '$$') afin # # d'eviter le message : # # # # Killed # # # # d'auto-abort... # # # # On notera le 20131128145729, l'introduction de commandes suplementaires a tuer selon # # la syntaxe : # # # # $xcg/FindExec.01$Z AbortFindExec "|valgrind|Mesures.01$vv$Z" # # $xcg/FindExec.01$Z AbortFindExec "|valgrind|RMesures.01$vv$Z" # # $xcg/FindExec.01$Z AbortFindExec "|valgrind|Mesures_CDC_seules.01$vv$Z" # # # # /|\ /|\ # # | | # # ATTENTION au "|" en tete de liste ------- puis - # # # # par exemple... # ATTENTION "Il peut etre necessaire de recommencer une deuxieme fois, voire plus..." saut 2 exit $OK # Introduit le 20131125145756 : ce n'est peut-etre pas tres elegant de faire ce 'exit', # # mais c'est le plus simple... # else endif set VDiReCtOrY=`echo "$DiReCtOrY" | $GRE "^$K_sepS"` #20131206093713____:if (("$DiReCtOrY" == "$Dcourant") || (! -e $DiReCtOrY)) then # #20131209162927____:if ("$VDiReCtOrY" == "$K_VIDE") then # if (("$DiReCtOrY" != "$K_VIDE") && ("$VDiReCtOrY" == "$K_VIDE")) then # La modification du 20131209162927 est destinee a prendre en compte les cas ou l'on # # "repart" sur une liste anterieure '$ListeFichierA'... # #20131206093713____: EROR "Le directory '$DiReCtOrY' n'existe pas ou est le directory courant." # EROR "Le directory '$DiReCtOrY' doit etre absolu." # Et ceci a cause de la modification 'v $xcg/FindExec.01$Z 20130923103512' qui force le # # directory courant ('$xT') et fait donc perdre le directory courant precedent... # exit $OK # Ce n'est peut-etre pas tres elegant de faire ce 'exit', mais c'est le plus simple... # else endif unset VDiReCtOrY if ( ("$DiReCtOrY" == "$K_VIDE") \ && ("$PoStFiXe" == "$K_VIDE") \ && ("$CoMmAnDe" == "$K_VIDE") \ && ("$ExClUsIoNs" == "$K_VIDE") \ && ("$ArGuMeNtS" == "$K_VIDE") \ && ("$ListeFichierA" == "$K_VIDE") \ ) then # Test introduit le 20130307181610... # EROR "Il n'y a aucun arguments." pause "Doit-on continuer malgre tout (un <CTRL-C><ENTER> arrete tout) ?" pause "Est-ce bien sur (un <CTRL-C><ENTER> arrete tout) ?" else endif #20190930152626____:set DCoMmAnDe=`GetPath $CoMmAnDe` # set VCoMmAnDe=($CoMmAnDe) set DCoMmAnDe=`GetPath $VCoMmAnDe[$#VCoMmAnDe]` unset VCoMmAnDe # La modification du 20190930152626 est destinee a traiter, par exemple, le cas ou # # '$CoMmAnDe' serait : # # # # duree $xcc/cbg$Z # # # if ("$DCoMmAnDe" == "$xcc") then # Test introduit le 20190412170519... # #20220105112608____: ATTENTION "En cas de compilations, il peut etre utile de faire un $K_QS""trouvV""$K_QS au prealable \\c" # ATTENTION "En cas de compilations, il peut etre utile de faire un $K_QS""trouvV""$K_QS au prealable \c" echo "au cas ou des fichiers utiles seraient restes verrouilles apres une eventuelle compilation anterieure abortee." saut 2 # Introduit le 20190412161205 suite a 'v $xcc/cpp$Z 20190412140849' probleme, cause par # # le fichier 'v $ximd/DerivFormel.1$DEF' qui etait reste verrouille suite a une compilation # # anterieure abortee. Or malheureusement, on ne peut editer des messages d'avertissement # # dans 'v $xi/DerivFormel$Z 20190412143041' puisque toutes les sorties sont redirigees # # vers des "pipes" et/ou des fichiers... D'ou ce message preliminaire... # else endif unset DCoMmAnDe if ($?SFindExec == $NEXIST) then setenv SFindExec $EXIST # Afin de pouvoir forcer la definition d'alias et de variables "complementaires" (introduit # # le 20150205112002). # # # # Le 20150205112935, je note que cela n'a d'utilite qu'en mode sequentiel car, en effet, # # en mode parallele c'est dans 'v $xcs/Linda$vv$Z SLinda' que c'est utile... # else endif if ($?FindExec_InverserOrdre == $NEXIST) then setenv FindExec_InverserOrdre $NEXIST # Afin de pouvoir inverser l'ordre d'execution des commandes (introduit le 20101119092146 # # sous cette forme...). # else endif if ($?FindExec_MessagesBP == $NEXIST) then setenv FindExec_MessagesBP $EXIST # Afin de pouvoir editer les messages relatifs aux Branches Paralleles (introduit le # # 20150205105239). # else endif if ($?FindExec_Editer == $NEXIST) then #20090207095538____: set FindExec_Editer=$NEXIST # setenv FindExec_Editer $NEXIST # Afin d'editer la methode utilisee (introduit le 20090119164517). # # # # Le 'set' fut remplace par un 'setenv' le 20090207095538 afin de rappeler son usage en # # tant que parametre de configuration "externe" a '$xcg/FindExec.01$Z'... # else endif if ($?FindExec_Parallele == $NEXIST) then #20090207095538____: set FindExec_Parallele=$EXIST # #20190106102324____: setenv FindExec_Parallele $EXIST # # Introduit le 20090119164517 pour autoriser ('$EXIST') ou inhiber ('$NEXIST') la # # parallelisation... # # # # Le 'set' fut remplace par un 'setenv' le 20090207095538 afin de rappeler son usage en # # tant que parametre de configuration "externe" a '$xcg/FindExec.01$Z'... # if ($ProcessorNumber > 1) then # Test introduit le 20190106102324... # setenv FindExec_Parallele $EXIST else setenv FindExec_Parallele $NEXIST endif else endif if ($?FindExec_ParalleleLinda == $NEXIST) then #20090207095538____: set FindExec_ParalleleLinda=$NEXIST # #20090209092816____: setenv FindExec_ParalleleLinda $NEXIST # setenv FindExec_ParalleleLinda $EXIST # Introduit le 20090119105236 pour autoriser ('$EXIST') ou inhbier ('$NEXIST') la methode # # 'v $xcs/Linda$vv$Z'. On notera que cette methode, si elle utilise au mieux le # # parallelisme (ce que ne fait pas l'autre methode, puisque '$xcg/parallele.1?$X' ne # # rend la main que lorsque toutes les commandes qu'il lance sont terminees), presente # # un defaut celui de ne pas sortir les messages {stdout,stderr} dans le bon ordre... # # Enfin, la directive 'TestP' ne peut etre utilisee ('v $xcg/FindExec.01$Z 20090119105236'). # # C'est pour toutes ces raisons qu'a priori le parallelisme de type 'Linda' est inhibe... # # # # Le 'set' fut remplace par un 'setenv' le 20090207095538 afin de rappeler son usage en # # tant que parametre de configuration "externe" a '$xcg/FindExec.01$Z'... # else endif set CoMmAnDeS=`echo "$CoMmAnDe" | $AW -F "," ' { print $1 } '` # Definition de la commande "Serie" (introduite le 20090119081320). # set CoMmAnDeP=`echo "$CoMmAnDe" | $AW -F "," ' { print $2 } '` # Definition de la commande "Parallele" (introduite le 20090119081320). # set CoMmAnDeV=`echo "$CoMmAnDe" | $AW -F "," ' { print $3 } '` # Afin de valider l'argument '$CoMmAnDe'... # setArgum CoMmAnDeP "$CoMmAnDeS" # Definition de la commande "Parallele" par defaut... # if ("$CoMmAnDeV" != "$K_VIDE") then EROR "Trop de commandes ont ete precisees : les commandes supplementaires sont ignorees." else endif unset CoMmAnDeV set ExClUsIoNs=`echo "$ExClUsIoNs" | $SE -e "s/! *-name *//g"` # Nettoyage a priori (en cas d'usage de type compatibilite) introduit le 20090207113437. # if ("$ExClUsIoNs" == "!") then EROR "La liste des exclusions ('$ExClUsIoNs') est incorrecte, elle est donc ignoree." set ExClUsIoNs="$K_VIDE" # Introduit le 20070130120852 suite a une tentative de lancer : # # # # job $xcg/FindExec.01$Z $x $X $xcc/clg$Z "! -name cpp$X" ... # # # # l'argument "! -name cpp$X" etant clairement transforme par 'job'... # else endif #20090207125013____:set ExClUsIoNs=`echo "$ExClUsIoNs" | $SE -e "s/\([^ ]*\)/! -name \1/g"` # set ExClUsIoNs=`echo "$ExClUsIoNs" | $R "$K_BLANC" "|"` # Structuration correcte de '$ExClUsIoNs' introduite le 20090207113437. # #20101012082832____:if ("$ArGuMeNtS" != "$K_VIDE") then # #20101012082832____: set ArGuMeNtS=" ""$ArGuMeNtS" # # Afin d'eviter une malheureuse concatenation en queue des commandes... # #20101012082832____:else # #20101012082832____:endif # if ($SFindExec == $EXIST) then # Test introduit le 20150205112002... # # # # Le 20150205112935, je note que cela n'a en fait d'utilite qu'en mode sequentiel car, en # # effet, en mode parallele c'est dans 'v $xcs/Linda$vv$Z SLinda' que c'est utile. Mais, # # malheureusement, il est trop pour decider ici quel mode sequentiel ou parallele sera # # effectivement utilise. # if ( ("$mHOTE" == "$mDev_WWW") \ || ($sHOTE == $sPORTABLE_1) \ || ($sHOTE == $sPORTABLE_2) \ || ($sHOTE == $sPORTABLE_3) \ || ($sHOTE == $sPORTABLE_4) \ || ($sHOTE == $sPORTABLE_5) \ || ($sHOTE == $sPORTABLE_6) \ || ($sHOTE == $sPORTABLE_7) \ ) then # Le 20080101102907 furent introduites '$sPORTABLE_3' et '$sPORTABLE_4' car, en effet, ces # # MACHINEs avaient ete oubliees... # if (-e $xiMo/serveur.01$vv$Y) then # Ce test a ete ajoute lors du demarrage a froid de '$LACT15' le 20021212120108... # set NoCheckServeur=$EXIST source $xiMo/serveur.01$vv$Y unset NoCheckServeur # Et ce afin de pouvoir disposer d'alias du type 'Gserveur' sur '$mDev_WWW'. # else endif else endif if (-e $xrC/Definitions.01$vv$Y) then set No_Sdu=$EXIST source $xrC/Definitions.01$vv$Y unset No_Sdu # Introduit pour 'v $xrC/EffectuerSondelettesMesures.01$vv$Z .xcg.ExecParallele.01.Z' et # # pour 'v $xrC/EffectuerSplanMesures.01$vv$Z .xcg.ExecParallele.01.Z' le 20141014075503. # # # # La gestion de '$No_Sdu' a ete introduite le 20150205103431 pour 'v $xiirs/.MOBI.13.1.$U' # # (en notant le changement de nom 'v $Dhistory/LACT19$D/20150302102123 20150225084445'...). # else endif else endif #20130307175501____:if ($FindExec_Parallele == $EXIST) then # #20130307175501____: if ($FindExec_ParalleleLinda == $EXIST) then # #20130307175501____: if ("$ListeFichierA" != "$K_VIDE") then # #20130307175501____: if (-e $ListeFichierA) then # #20130307175501____: set UListeFichierA=$EXIST # # Afin de savoir si une liste anterieure '$ListeFichierA' peut etre utilisee... # #20130307175501____: else # #20130307175501____: endif # #20130307175501____: else # #20130307175501____: endif # #20130307175501____: else # #20130307175501____: endif # #20130307175501____:else # #20130307175501____:endif # if ("$ListeFichierA" != "$K_VIDE") then if (-e $ListeFichierA) then set UListeFichierA=$EXIST # Afin de savoir si une liste anterieure '$ListeFichierA' peut etre utilisee... # # # # La modification du 20130307175501 est due a 'v $xiMos/GserveurB$vv$Y 20130307132755'... # else endif else endif #20070423085441____:FileTmpB ListeFichier $Y # #20090115171743____:FileTmpB ListeFichier $Y FindExec # FileTmpB ListeFichier $T FindListe # Generation d'un nom de fichier temporaire de sauvegarde... # setenv ListeFichierEnv $ListeFichier # Introduit le 20211115113239 afin de permettre un compactage du fichier '$ExecFichier'... # if ($?UListeFichierA == $NEXIST) then # Cas ou l'on ne reprend pas une liste anterieure '$ListeFichierA' (test introduit le # # 20090615143636). # if ("$DiReCtOrY" == "$x") then set DiReCt_ExClUs="$ExclusionFINx" # Ceci fut introduit le 20080129092625 a cause d'un incident sur '$LACT18' lors d'un # # '$xcc/RecompileAll$Z' (en mode 'PRAGMA_CL_____PAS_DE_LIBRAIRIES_DYNAMIQUES'). D'une part, # # un 'substitue.01$X' fut trouve dans '$xTG' et d'autre part '$xwm' etait monte. En ce qui # # concerne le 'substitue.01$X', il n'avait pas de 'substitue.01$K' associe (evidemment...) ; # # quant a '$xwm', la compilation y a eu lieu (ce qui est contraire a la notion de miroir, # # puisqu'il s'agit d'une arborescence dans laquelle il est interdit de travailler ; au # # passage les '$X' alors generes etaient 'UNEXEC'...). # else set DiReCt_ExClUs="$K_VIDE" endif #:$FIN $DiReCtOrY $follow $DiReCt_ExClUs \( -name .\*$PoStFiXe -o -name \*$PoStFiXe \) $ExClUsIoNs \( -type d -o -type f \) -print \ # #20090207125013____: | $GRE -v "$K_sepS$ESSAIS$K_sepS" \ # #20090207125013____: | $GRE -v "$K_sepS$TEMPORAIRES$K_sepS" \ # #20090207125013____: | $SOR -u \ # #20090207125013____: | $SE -e "s+^\""$Dcourant$K_sepS++" \ # #20090207125013____: > $ListeFichier # if ("$ExClUsIoNs" == "$K_VIDE") then set ExClUrE="$CA" else set ExClUrE="$EGRE -v -e $K_QD$ExClUsIoNs$K_QD" endif #201011181813:$FIN $DiReCtOrY $follow $DiReCt_ExClUs \( -name .\*$PoStFiXe -o -name \*$PoStFiXe \) \( -type d -o -type f \) -print \ # #20101118181302____: |& $R "$K_TAB" "$K_BLANC" \ # #20101118181302____: | $SE -f $Ffind_error \ # #20101118181302____: | (eval "$ExClUrE") \ # #20101118181302____: | $GRE -v "$K_sepS$ESSAIS$K_sepS" \ # #20101118181302____: | $GRE -v "$K_sepS$TEMPORAIRES$K_sepS" \ # #20101118181302____: | $SOR -u \ # #20101118181302____: | $SE -e "s+^\""$Dcourant$K_sepS++" \ # #20101118181302____: > $ListeFichier # #20101119092146____: if ($?FindExec_InverserOrdre == $NEXIST) then # if ($FindExec_InverserOrdre == $NEXIST) then set InVeRsEr="$K_VIDE" else set InVeRsEr="-r" # Ceci fut introduit le 20101118181302 pour 'v $xb/GENERE$Z FindExec_InverserOrdre'. En # # effet, la librairie 'v $xbmcf/conformes$K' est tres longue a compiler, or elle se # # retrouvait en dernier sur l'une des branches paralleles, les autres branches etant alors # # inoccupees et le processus devenant sequentiel. Ainsi, en inversant l'ordre, j'espere # # faire du parallelisme jusqu'au bout, meme s'il s'agit d'un bricolage un peu specifique, # # mais je ne vois pas comment faire autrement... # endif $FIN $DiReCtOrY $follow $DiReCt_ExClUs \( -name .\*$PoStFiXe -o -name \*$PoStFiXe \) \( -type d -o -type f \) -print \ |& $R "$K_TAB" "$K_BLANC" \ | $SE -f $Ffind_error \ | (eval "$ExClUrE") \ | $GRE -v "$K_sepS$ESSAIS$K_sepS" \ | $GRE -v "$K_sepS$TEMPORAIRES$K_sepS" \ | $SOR -u $InVeRsEr \ | $SE -e "s+^\""$Dcourant$K_sepS++" \ > $ListeFichier # Generation de la liste des fichiers a traiter (introduit le 20090115171743). # unset InVeRsEr unset ExClUrE unset DiReCt_ExClUs else if ("$CoMmAnDeP" != "$K_VIDE") then $CA $ListeFichierA \ | $SE -e "s+$CoMmAnDeP *++" \ | $SE -e 's/^\([^ ]*\) .*$/\1/' \ > $ListeFichier # Recuperation d'une liste Anterieure (introduit le 20090615161009). # # # # Ainsi il est possible de recuperer une liste anterieure '$ListeFichierA' ce qui permet # # donc de reprendre un '$xcg/FindExec.01$Z' interrompu (introduit le 20090615143636), mais # # evidemment cela n'a de sens que si 'v $xcs/Linda$vv$Z' est utilise, puisque dans ce # # cas le fichier '$ListeFichier' est progressivement "amaigri", les commandes executees # # y etant supprimees (on suppose evidemment que le 'v $xcs/Linda$vv$Z' anterieur a ete # # interrompu proprement, c'est-a-dire en utilisant 'BloqueP'...). # else $CA $ListeFichierA \ > $ListeFichier # Possibilite introduite le 20130305105134 pour 'v $xiMos/GserveurB$vv$Y .xcg.FindExec.01.Z'. # endif endif unset UListeFichierA set NoMbRePrOcEsS=1 # A priori, pas de parallelisation... # #20090415103801____:set PPaRaLlElE="$xcg/parallele.14$X" # set PPaRaLlElE="$xcg/parallele.1N$X" # Definition introduite le 20090415103254... # if ($FindExec_Parallele == $EXIST) then #20130924161410____: set NFiLe_DeScRiPtOrS=`limit | $R "$K_TAB" "$K_BLANC" | $GRE "^descriptors " | $AW ' { print $2 } '` # #20130924161410____: if ("$NFiLe_DeScRiPtOrS" != "$K_VIDE") then # #20130924161410____: @ RaPpOrTc = $NFiLe_DeScRiPtOrS / $ProcessorNumber # #20130924161410____: @ RaPpOrTl = 1024 / 8 # # Calcul du rapport Courant et du rapport Limite (etabli heuristiquement sur '$LACT19' # # aux alentours du 20130923154324) entre le nombre de fichiers ouvrables et le nombre # # de processeurs utilisables... # #20130924161410____: if ($RaPpOrTc < $RaPpOrTl) then # #20130924161410____: EROR "Le nombre maximal de fichiers ouvrables est peut-etre insuffisant : \c" # #20130924161410____: @ PrOcEsSoRNuMbEr = $NFiLe_DeScRiPtOrS / $RaPpOrTl # #20130924161410____: echo "le nombre de processeurs utilisables passe donc de $ProcessorNumber a $PrOcEsSoRNuMbEr." # #20130924161410____: setenv ProcessorNumber $PrOcEsSoRNuMbEr # # Suite au probleme 'v $xcg/FindExec.01$Z 20130923095721', ce dispositif "heuristique" # # fut introduit le 20130923154324... # #20130924161410____: unset PrOcEsSoRNuMbEr # #20130924161410____: else # #20130924161410____: endif # #20130924161410____: unset RaPpOrTc # #20130924161410____: unset RaPpOrTl # #20130924161410____: else # #20130924161410____: EROR "Le nombre maximal de fichiers ouvrables n'est pas connu." # #20130924161410____: endif # #20130924161410____: unset NFiLe_DeScRiPtOrS # #20090119082722____: set EsT_Ce_un_Z=`echo "$CoMmAnDe" | $GRE "\""$Z"'$'` # #20090119164359____: set EsT_Ce_un_Z=`echo "$CoMmAnDeP" | $GRE "\""$Z"'$'` # set EsT_Ce_un_Z=`echo "$CoMmAnDeP" | $AW ' { print $1 } ' | $GRE "\""$Z"'$'` # Introduit le 20090118092529 a cause du redoutable probleme des alias... # #20090119105236____: if ("$EsT_Ce_un_Z" != "$K_VIDE") then # if (($FindExec_ParalleleLinda == $EXIST) || ("$EsT_Ce_un_Z" != "$K_VIDE")) then # On notera que 'v $xcs/Linda$vv$Z source' etant lui-meme un '$Z', tous les alias y sont # # definis ; de plus il effectue des 'source's. Ainsi, donc des alias tels 'Gserveur' peuvent # # etre executes via '$CoMmAnDe'. C'est pourquoi '$xcs/Linda$vv$Z' est la solution la plus # # "performante" d'une part parce que le parallelisme qu'il permet est le plus efficace et # # parce que d'autre part il "connait" tous les 'alias's... # # # # 'Linda' est autorise ou bien la commande semble etre un '$Z', on peut donc tenter # # la parallelisation : # set NoMbRePaRaLlEleS=`GetParam $PPaRaLlElE NombreProcessParalleles` # Afin de voir s'il est possible de paralleliser sur cette MACHINE... # #20090119164517____: set VaLiDe=`echo "$NoMbRePaRaLlEleS" | $GRE "NombreProcessParalleles" | $GRE -i "inexistant"` # set VaLiDe=`echo "$NoMbRePaRaLlEleS" | $GRE "^[$Alphabet_0_9]*"'$'` # Validation introduite le 20090116130748... # #20090119164517____: if ("$VaLiDe" == "$K_VIDE") then # if ("$VaLiDe" != "$K_VIDE") then set NoMbReFiChIeRs=`$CA $ListeFichier | $WCl` if ($NoMbReFiChIeRs >= $NoMbRePaRaLlEleS) then set NoMbRePrOcEsS=$NoMbRePaRaLlEleS else set NoMbRePrOcEsS=$NoMbReFiChIeRs # Introduit le 20131129134909. Avant cette date, lorsqu'il y avait moins de fichiers # # ('$NoMbReFiChIeRs') que de processeurs ('$NoMbRePaRaLlEleS') on ne parallelisait pas # # ce qui etait un peu du gachis, mais ce n'est peut-etre pas une bonne idee... # endif unset NoMbReFiChIeRs else EROR "Commande '"'$xcg/parallele.1?$X'"' inexistante ou "'"NombreProcessParalleles="'" non reconnu." endif unset VaLiDe unset NoMbRePaRaLlEleS else # Dans le cas ou la commande n'est pas un '$Z', il y a de grandes chances pour qu'elle soit # # un alias ('v $xiMo/ReGENEREAll$Z Gserveur'). Alors, dans '$xcg/parallele.1?$X' il # # conviendrait de lancer, non pas '$CoMmAnDeP', mais quelque chose du type : # # # # $CSH -c $CoMmAnDeP # # # # mais cela n'est pas aussi simple que cela car il faudrait quoter a cause des arguments : # # # # $CSH -c "$CoMmAnDeP $ArGuMeNtS" # # # # Or cela semble tres difficile, de par la structure des liste '$LCoMmAnDeS' ci-apres... # # D'autre part, il faudrait faire les sources, tel : # # # # set NoCheckServeur=$EXIST # # source $xiMo/serveur.01$vv$Y # # unset NoCheckServeur # # # # et enfin, '$CSH' est penalisant au niveau temps d'execution. Donc, provisoirement (?) le # # parallelisme est inhibe en l'absence de '$Z'... # # # # On notera le 20090118114804 'v $xiMo/ReGENEREAll$Z 20090118114614' ou 'Gserveur' a ete # # remplace par '$xiMo/Gserveur$Z' pour cette raison... # endif unset EsT_Ce_un_Z else endif FilSTmpB ExecFichier $Y FindExec # Generation d'un nom de fichier temporaire de sauvegarde... # $CA $xcs/csh$Y \ >> $ExecFichier echo "xT" \ >> $ExecFichier # Introduit le 20130923103512 afin de reduire la longueur de '$ExecFichier' avant de # # le "sourcer" en permettant donc de ne donner que le nom relatif (a '$xT') des fichiers # # temporaires de redirection... # # # # On notera le 20131206093713 que c'est ce changement de directory ('xT') qui a contraint # # a rendre necessaire que '$DiReCtOrY' soit absolu (et ainsi ne soit plus, par exemple, # # '$Dcourant' comme c'etait un usage tres repandu avant cette date...). # #20090116130748____:if ($NoMbRePrOcEsS == 1) then # if ($NoMbRePrOcEsS <= 1) then # Cas ou la parallelisation n'est pas possible : # if ($FindExec_Editer == $EXIST) then #20090120110056____: echo "Mode Sequentiel d'execution des commandes." # #20090207154407____: echo "Mode Sequentiel d'execution des commandes dans '"'$xcg/FindExec.01$Z'"'." # #20090208093422____: EcHoR "Mode Sequentiel d\'execution des commandes dans \'$xcg/FindExec.01$Z\'." # #20090226101118____: EchoJob "Mode Sequentiel d\'execution des commandes dans \\c" # #20090226101118____: EchoJob "\'$K_DOLLAR""K_DOLLAR$K_QD$K_QD""xcg/FindExec.01$K_DOLLAR""K_DOLLAR$K_QD$K_QD""Z\'." # EchoJob "Mode Sequentiel d'execution des commandes dans \c" EchoJob "'$K_DOLLAR""K_DOLLAR$K_QD$K_QD""xcg/FindExec.01$K_DOLLAR""K_DOLLAR$K_QD$K_QD""Z'." # Message introduit le 20090119164517... # else endif #20090119082722____: $CA $ListeFichier \ # #20090119082722____: | $SE -e "s+^+TestP ; $CoMmAnDe +" \ # #20090119082722____: -e 's+$+'"$ArGuMeNtS+" \ # #20090119082722____: >> $ExecFichier # #20101012082832____: $CA $ListeFichier \ # #20101012082832____: | $SE -e "s+^+TestP ; $CoMmAnDeS +" \ # #20101012082832____: -e 's+$+'"$ArGuMeNtS+" \ # #20101012082832____: >> $ExecFichier # if ("$ArGuMeNtS" != "$K_VIDE") then # Test introduit le 20101230110652... # $CA $ListeFichier \ | $SE -e "s+^+TestP ; $CoMmAnDeS +" \ -e 's+$+'" $K_QD$ArGuMeNtS$K_QD+" \ >> $ExecFichier else $CA $ListeFichier \ | $SE -e "s+^+TestP ; $CoMmAnDeS +" \ >> $ExecFichier endif # Generation d'un fichier contenant une commande par fichier repondant aux criteres... # # On notera que par rapport a : # # # # $FIN $DiReCtOrY $follow -name \*$PoStFiXe -type f -exec $CoMmAnDe {} \; # # # # cette solution a deux avantages : d'une part, la liste des fichiers est triee, et d'autre # # part, la liste des fichiers est etablie avant que '$CoMmAnDe' ne s'execute, or cette # # derniere peut modifier l'arborescence, ce qui peut provoquer des messages du type : # # # # No such file or directory # # # # qui sont "asynchrones" et donc difficiles a eliminer... # # # # L'elimination de '$xTG' (via '$TEMPORAIRES') a ete ajoutee le 20000203164547 ; ceci a ete # # justifie par le fait que depuis le 19991129165326 ('v $xcc/cl$Z 19991129165326') tous les # # '$X' generes voient leurs eventuelles versions anterieures sauvegardees dans '$xT'... # # # # Le 20000329094634 j'ai ajoute a '-type f' l'option '-type d' afin de permettre a la # # commande '$xiM/GENERE$Z' de generer les images de '$xiMd' qui sont en fait reperees # # par des noms de directories '$D' et non par des fichiers '$m4'... # # # # Le 20010118174446 j'ai ajoute la recherche des noms commencant par "." ('.\*$PoStFiXe') # # a cause de la commande 'v $xiMo/CheckAll$Z FindExec.01.Z' car effectivement '$xiMi' # # contient des structures '$D' commencant par ".". # # # # Le 20010316090015 j'ai ajoute la suppression des "./" qui precedente les noms de fichiers # # lorsque '$DiReCtOrY' est '$Dcourant' et ceci afin de permettre au test du "relai universel" # # ('v $xiMos/Gserveur$vv$Y ReLaIuNiVeRsEl') de se faire correctement sur '$mDev_WWW'... # # # # L'elimination de '$xu' (via '$ESSAIS') a ete ajoutee le 20011205140343 ; ceci a ete # # justifie par le fait qu'il peut y avoir, par exemple, de nombreux '$X' dans '$xu' (en # # particulier dans 'v $xu/Felici.M/$Fnota 3D_Acinus.X', v $xu/Baldassarri.A/$Fnota sqetch.X' # # ou encore dans 'v $xu/Gondran.A/$Fnota'). # # # # Le 20030821175800 j'ai introduit 'v $Ffind_error' afin d'eliminer des messages # # d'erreur de '$FIN' dus, par exemple, au directory '$x/$D_netscape' sur '$CMAP28' et sur # # '$LACT15'... # # # # Le 20060318161818 j'ai introduit un 'TestP' devant la commande '$CoMmAnDe'. L'interet de # # ceci est de pouvoir mettre periodiquement en attente '$xcg/FindExec.01$Z' avant chaque # # commande qu'il execute. Ainsi, par exemple, durant un 'v $xcc/RecompileAll$Z', on pourra # # mettre l'un des '$Z' utilise ('$xcc/cpp$z',...) sans danger. Le blocage se fera par : # # # # BloqueP $xcg/FindExec.01$Z # # # # et le deblocage par : # # # # DBloqueP $xcg/FindExec.01$Z # # # # et c'est tout... # # # # Le 20080129092625 j'ai introduit '$DiReCt_ExClUs' qui manquait (sur '$LACT18'...). # # # # Le 20101230105622 on notera que la presence systematique de '$ArGuMeNtS' peut etre la # # cause de problemes et par exemple du message d'erreur : # # # # ls: : No such file or directory # # # # dans le cas ou '$commandeS' serait la commande 'll' et ou '$ArGuMeNtS' serait vide, # # d'ou la modification du 20101230110652... # else # Cas ou la parallelisation est possible (introduite le 20090115173510) : # set ReDiReCtIoN="%%" #20130924163909____: FileTmpB FReDiReCtIoN # FileTmpB FReD # Definition (arbitraire provisoirement ?) des redirections, en notant qu'il pourrait etre # # preferable d'utiliser : # # # # FileTmpB FReDiReCtIoN $K_QD$K_VIDE$K_QD $K_QD$K_VIDE$K_QD $xTR # # # # pour garantir la perennite des fichiers '$FReDiReCtIoN*'... # # # # On notera qu'en mode parallele, il est obligatoire de rediriger 'stdout' et 'stderr' car, # # en effet, sinon les sorties 'stdout' et 'stderr' des processus paralleles se melangeraient # # a l'ecran... # # # # Le 20130924162731, le nom 'FReDiReCtIoN' a ete remplace par 'FReD' afin de raccourcir # # le plus possible la longueur de '$ExecFichier' avant de le "sourcer"... # setenv FReDEnv `GetLeaf $FReD` # Introduit le 20211115113239 afin de permettre un compactage du fichier '$ExecFichier'... # if ($FindExec_ParalleleLinda == $EXIST) then # Cas ou l'on va utiliser 'v $xcs/Linda$vv$Z' : # if ($FindExec_Editer == $EXIST) then #20090120110056____: echo "Mode Parallele 'Linda' d'execution des commandes." # #20090207154407____: echo "Mode Parallele 'Linda' d'execution des commandes dans '"'$xcg/FindExec.01$Z'"'." # #20090208093422____: EcHoR "Mode Parallele \'Linda\' d\'execution des commandes dans \'$xcg/FindExec.01$Z\'." # #20090226101118____: EchoJob "Mode Parallele \'Linda\' d\'execution des commandes dans \\c" # #20090226101118____: EchoJob "\'$K_DOLLAR""K_DOLLAR$K_QD$K_QD""xcg/FindExec.01$K_DOLLAR""K_DOLLAR$K_QD$K_QD""Z\'." # EchoJob "Mode Parallele 'Linda' d'execution des commandes dans \c" EchoJob "'$K_DOLLAR""K_DOLLAR$K_QD$K_QD""xcg/FindExec.01$K_DOLLAR""K_DOLLAR$K_QD$K_QD""Z'." # Message introduit le 20090119164517... # else endif FilSTmpB FVeRrOuB # Definition des verrous de blocage de 'v $xcs/Linda$vv$Z VerrouBlocage' introduits le # # 20090317101238... # setenv FVeRrOuBEnv $FVeRrOuB # Introduit le 20211115113239 afin de permettre un compactage du fichier '$ExecFichier'... # FileTmpB LiStE_LiNdA #20090119105236____: $CA $ListeFichier \ # #20090119105236____: | $SE -e "s+^+TestP ; $CoMmAnDeS +" \ # #20090119105236____: -e 's+$+'"$ArGuMeNtS+" \ # #20090119105236____: > $LiStE_LiNdA # #20101012082832____: $CA $ListeFichier \ # #20101012082832____: | $SE -e "s+^+$CoMmAnDeS +" \ # #20101012082832____: -e 's+$+'"$ArGuMeNtS+" \ # #20101012082832____: > $LiStE_LiNdA # if ("$ArGuMeNtS" != "$K_VIDE") then # Test introduit le 20101230110652... # $CA $ListeFichier \ | $SE -e "s+^+$CoMmAnDeS +" \ -e 's+$+'" $K_QD$ArGuMeNtS$K_QD+" \ > $LiStE_LiNdA else $CA $ListeFichier \ | $SE -e "s+^+$CoMmAnDeS +" \ > $LiStE_LiNdA endif # On notera que l'on ne peut pas mettre ici 'TestP' car, en effet, ici il est relatif a # # 'v $xcs/Linda$vv$Z' ; or plusieurs (2, 4,...) occurences de celui-ci vont etre lancees # # et donc risquer de se mettre mutuellement en attente via ce 'TestP'... # # # # Le 20101230105622 on notera que la presence systematique de '$ArGuMeNtS' peut etre la # # cause de problemes et par exemple du message d'erreur : # # # # ls: : No such file or directory # # # # dans le cas ou '$commandeS' serait la commande 'll' et ou '$ArGuMeNtS' serait vide, # # d'ou la modification du 20101230110652... # $DELETE $ListeFichier $MV $LiStE_LiNdA $ListeFichier FileTmpE LiStE_LiNdA $NEXIST ro $ListeFichier # Le fichier '$ListeFichier' doit etre en mode 'ro' a cause de 'v $xcs/Linda$vv$Z rwv' et # # ne contenir que la liste des fichiers (et rien d'autre...). # #20090415103254____: set En_TeTe='$xcg/parallele.14$X' # set En_TeTe="$PPaRaLlElE" #20130923095721____: set CoMmAnDeL="$xcs/Linda$vv$Z" # set CoMmAnDeL='$xcs/Linda$vv$Z' # La modification du 20130923095721 est destinee a raccourcir le fichier '$ExecFichier' en # # cours de generation... # #20090317101922____: set ArG_ReDiR="$ListeFichier $ReDiReCtIoN" # set LPoStFiXeS1=`$xci/nombres$X A="$K_sepP" premiere=1 derniere=$NoMbRePrOcEsS` @ NoMbRePrOcEsSp1 = $NoMbRePrOcEsS + 1 set LPoStFiXeS2=`$xci/nombres$X A="$K_sepP" premiere=1 derniere=$NoMbRePrOcEsSp1` set LCoMmAnDeS=($LPoStFiXeS2) # Initialisation arbitraire de '$LCoMmAnDeS' uniquement destinee a faire que cette liste ait # # le bon nombre d'elements afin de permettre ci-apres son initialisation element par element, # # sachant que l'on ne peut la definir "globalement", en une seule fois, a cause des '$K_QS's, # # '$K_QD's et des espaces qu'elle contient... # set LiMiTeUr="#" set NBrAn=1 foreach BrAnChE ($LPoStFiXeS2) @ NBrAn_1 = $NBrAn - 1 if ($NBrAn == 1) then #20100522103903____: set LCoMmAnDeS[$NBrAn]="$En_TeTe"' commande="'"$CoMmAnDeL " # #20140419102236____: set LCoMmAnDeS[$NBrAn]="$En_TeTe"' parallele_14=FAUX commande="'"$CoMmAnDeL " # set LCoMmAnDeS[$NBrAn]="$En_TeTe"' parallele_14=FAUX dupliquer=FAUX commande="'"$CoMmAnDeL " # Cette facon de proceder utilisant "commande="' et donc un nombre quelconque de processus # # paralleles a ete introduite le 20090511104936... # # # # La modification du 20140419102236 est destinee a ne pas dupliquer '$CoMmAnDeL' N fois # # (soit '$NoMbRePaRaLlEleS') puisqu'en fait '$CoMmAnDeL' contient deja N fois la "veritable" # # commande a executer, les occurences etant separees par '$LiMiTeUr'... # else if ($NBrAn < $NoMbRePrOcEsSp1) then set LCoMmAnDeS[$NBrAn]="$ListeFichier" set LCoMmAnDeS[$NBrAn]="$LCoMmAnDeS[$NBrAn] $FVeRrOuB$LPoStFiXeS2[$NBrAn_1]" set LCoMmAnDeS[$NBrAn]="$LCoMmAnDeS[$NBrAn] $ReDiReCtIoN" set LCoMmAnDeS[$NBrAn]="$LCoMmAnDeS[$NBrAn] $LiMiTeUr" set LCoMmAnDeS[$NBrAn]="$LCoMmAnDeS[$NBrAn] $CoMmAnDeL " else set LCoMmAnDeS[$NBrAn]="$ListeFichier" set LCoMmAnDeS[$NBrAn]="$LCoMmAnDeS[$NBrAn] $FVeRrOuB$LPoStFiXeS2[$NBrAn_1]" set LCoMmAnDeS[$NBrAn]="$LCoMmAnDeS[$NBrAn] $ReDiReCtIoN"'"' endif endif if ($NBrAn < $NoMbRePrOcEsSp1) then $CP -p $FVeRrOuB $FVeRrOuB$LPoStFiXeS2[$NBrAn] # Preparation des verrous de blocage... # else endif @ NBrAn = $NBrAn + 1 unset NBrAn_1 end unset BrAnChE unset LiMiTeUr unset NoMbRePrOcEsSp1 #20090317101922____: unset ArG_ReDiR # unset En_TeTe FileTmpB FichierT # Definition d'une liste de fichiers contenant en parallele les commandes et leurs arguments. # if ($FindExec_MessagesBP == $EXIST) then # Test introduit le 20181017151932... # EchoJob "\n\n" # Introduit le 20181017145613 pour aerer les mises en page... # else endif set NBrAnChE=1 foreach BrAnChE ($LPoStFiXeS2) if ($NBrAnChE > 1) then @ NBrAnChE_1 = $NBrAnChE - 1 # En fait, la redirection n'a de sens qu'a partir de '$LCoMmAnDeS[2]', d'ou le "-1"... # if ($FindExec_MessagesBP == $EXIST) then # Test introduit le 20150205105239... # #20090207154407____: echo "En mode 'parallele' ($NoMbRePrOcEsS branches) la redirection de {'stdout','stderr'} a lieu \c" # #20090207154407____: echo "automatiquement vers $NoMbRePrOcEsS fichiers dont '$FReDiReCtIoN$LPoStFiXeS2[$NBrAnChE_1]'." # #20090226101118____: EchoJob "En mode 'parallele' \($NoMbRePrOcEsS branches\) la redirection \\c" # #20090226101118____: EchoJob "de \{\'stdout\',\'stderr\'\} a lieu automatiquement \\c" # #20090226101118____: EchoJob "vers $NoMbRePrOcEsS fichiers dont \'$FReDiReCtIoN$LPoStFiXeS2[$NBrAnChE_1]\'." # #20101229153147____: EchoJob "En mode 'parallele' ($NoMbRePrOcEsS branches) la redirection \c" # #20181011131322____: EchoJob "En mode 'parallele' ($NoMbRePrOcEsS branches) $NoMbRePrOcEsS fichiers, \c" # #20181017145613____: EchoJob "\n\nEn mode 'parallele' ($NoMbRePrOcEsS branches) $NoMbRePrOcEsS fichiers, \c" # EchoJob "En mode 'parallele' ($NoMbRePrOcEsS branches) $NoMbRePrOcEsS fichiers, \c" #20090613175806____: EchoJob "de {'stdout','stderr'} a lieu automatiquement \c" # #20101229153147____: EchoJob "de {'stdout','stderr'} a lieu automatiquement et temporairement \c" # #20090317110158____: EchoJob "vers $NoMbRePrOcEsS fichiers dont '$FReDiReCtIoN$LPoStFiXeS2[$NBrAnChE_1]'." # #20101229153147____: EchoJob "vers $NoMbRePrOcEsS fichiers dont '$FReDiReCtIoN$LPoStFiXeS2[$NBrAnChE_1]' \c" # #20130924163909____: EchoJob "dont '$FReDiReCtIoN$LPoStFiXeS2[$NBrAnChE_1]', sont \c" # EchoJob "dont '$FReD$LPoStFiXeS2[$NBrAnChE_1]', sont \c" EchoJob "utilises pour la redirection automatique et temporaire de {'stdout','stderr'} \c" EchoJob "avec possibilite de blocage/deblocage via :" EchoJob "$Prompt""BloqueP $FVeRrOuB$LPoStFiXeS2[$NBrAnChE_1]" EchoJob "$Prompt""DBloqueP $FVeRrOuB$LPoStFiXeS2[$NBrAnChE_1]" # Possibilites de {BloqueP,DBloqueP} introduite le 20090317101555... # else endif else @ NBrAnChE_1 = $NBrAnChE # En fait, cette valeur est indifferente pour '$LCoMmAnDeS[1]'... # endif #20130924163909____: (saut) \ # #20130924163909____: | $SE -e 's+^$'"+$LCoMmAnDeS[$NBrAnChE]+" \ # #20130924163909____: -e "s+$ReDiReCtIoN+>> $FReDiReCtIoN$LPoStFiXeS2[$NBrAnChE_1] 2>\&1+" \ # #20130924163909____: > $FichierT$LPoStFiXeS2[$NBrAnChE] # (saut) \ | $SE -e 's+^$'"+$LCoMmAnDeS[$NBrAnChE]+" \ -e "s+$ReDiReCtIoN+>> $FReD$LPoStFiXeS2[$NBrAnChE_1] 2>\&1+" \ > $FichierT$LPoStFiXeS2[$NBrAnChE] # On notera la mise en place de redirections de type '$SHELL_BASH' puisque c'est sous ce # # "shell" que s'executeront les commandes... # unset NBrAnChE_1 @ NBrAnChE = $NBrAnChE + 1 end else # Cas ou l'on ne va pas utiliser 'v $xcs/Linda$vv$Z' : # if ($FindExec_Editer == $EXIST) then #20090120110056____: echo "Mode Parallele 'basique' d'execution des commandes." # #20090207154407____: echo "Mode Parallele 'basique' d'execution des commandes dans '"'$xcg/FindExec.01$Z'"'." # #20090208093422____: EcHoR "Mode Parallele \'basique\' d\'execution des commandes dans \'$xcg/FindExec.01$Z\'." # #20090226101118____: EchoJob "Mode Parallele \'basique\' d\'execution des commandes dans \\c" # #20090226101118____: EchoJob "\'$K_DOLLAR""K_DOLLAR$K_QD$K_QD""xcg/FindExec.01$K_DOLLAR""K_DOLLAR$K_QD$K_QD""Z\'." # EchoJob "Mode Parallele 'basique' d'execution des commandes dans \c" EchoJob "'$K_DOLLAR""K_DOLLAR$K_QD$K_QD""xcg/FindExec.01$K_DOLLAR""K_DOLLAR$K_QD$K_QD""Z'." # Message introduit le 20090119164517... # else endif #20090118085800____: set NoMbRePrOcEsS=4 # # Experience faite le 20090118081248 afin de voir si les performances ne sont pas meilleures # # ainsi. En effet, par exemple sur '$LACT18', le principe est donc de faire deux compilations # # en parallele via 'v $xcg/parallele.14$K'. Mais evidemment, elles n'ont en general pas la # # meme duree. Le process qui correspond a la plus courte des deux "perd" donc du temps en # # attendant celui qui correspond a la plus longue. En essayant de forcer '$NoMbRePrOcEsS' a # # quatre sur '$LACT18', je voulais voir si statistiquement ces "temps perdus" ne seraient # # pas ainsi compenses en faisant deux compilations "serie" en paralelle avec deux autres # # compilations "serie". Le benefice est non signficatif puisque que '$NoMbRePrOcEsS' vaille # # deux ou quatre, la duree est la meme ('v $xb/GENERE$Z 20090117102153')... La solution pour # # faire disparaitre ces attentes liees a l'utilisation de 'v $xcg/parallele.14$K' serait de # # s'orienter vers une solution de type 'v $xcs/Linda$vv$Z'... # #20090415103254____: set En_TeTe='TestP ; $xcg/parallele.14$X' # set En_TeTe="TestP ; $PPaRaLlElE" set ArG_ReDiR="$ArGuMeNtS $ReDiReCtIoN" if (($NoMbRePrOcEsS > 1) && ($NoMbRePrOcEsS <= 2)) then # Cas ou il y a 2 possibilites (valeur certaine) : # set LPoStFiXeS1=(.1 .2) set LPoStFiXeS2=($LPoStFiXeS1 .3) # On notera qu'il y a un postfixe de plus (3=2+1) que necessaire parce qu'il faut en fait # # "fermer" la derniere commande (la seconde)... # set LCoMmAnDeS=($LPoStFiXeS2) # Initialisation arbitraire de '$LCoMmAnDeS' uniquement destinee a faire que cette liste ait # # le bon nombre d'elements afin de permettre ci-apres son initialisation element par element, # # sachant que l'on ne peut la definir "globalement", en une seule fois, a cause des '$K_QS's, # # '$K_QD's et des espaces qu'elle contient... # #20090119082722____: set LCoMmAnDeS[1]="$En_TeTe"' C11="'"$CoMmAnDe " # #20090119082722____: set LCoMmAnDeS[2]="$ArG_ReDiR"'" C21="'"$CoMmAnDe " # #20090119082722____: set LCoMmAnDeS[3]="$ArG_ReDiR"'"' # set LCoMmAnDeS[1]="$En_TeTe"' C11="'"$CoMmAnDeP " set LCoMmAnDeS[2]="$ArG_ReDiR"'" C21="'"$CoMmAnDeP " set LCoMmAnDeS[3]="$ArG_ReDiR"'"' else # Cas ou il y a 4 possibilites (valeur "majoree" et "limitee") : # set LPoStFiXeS1=(.1 .2 .3 .4) set LPoStFiXeS2=($LPoStFiXeS1 .5) # On notera qu'il y a un postfixe de plus (5=4+1) que necessaire parce qu'il faut en fait # # "fermer" la derniere commande (la quatrieme)... # set LCoMmAnDeS=($LPoStFiXeS2) # Initialisation arbitraire de '$LCoMmAnDeS' uniquement destinee a faire que cette liste ait # # le bon nombre d'elements afin de permettre ci-apres son initialisation element par element, # # sachant que l'on ne peut la definir "globalement", en une seule fois, a cause des '$K_QS's, # # '$K_QD's et des espaces qu'elle contient... # #20090119082722____: set LCoMmAnDeS[1]="$En_TeTe"' C11="'"$CoMmAnDe " # #20090119082722____: set LCoMmAnDeS[2]="$ArG_ReDiR"'" C12="'"$CoMmAnDe " # #20090119082722____: set LCoMmAnDeS[3]="$ArG_ReDiR"'" C21="'"$CoMmAnDe " # #20090119082722____: set LCoMmAnDeS[4]="$ArG_ReDiR"'" C22="'"$CoMmAnDe " # #20090119082722____: set LCoMmAnDeS[5]="$ArG_ReDiR"'"' # set LCoMmAnDeS[1]="$En_TeTe"' C11="'"$CoMmAnDeP " set LCoMmAnDeS[2]="$ArG_ReDiR"'" C12="'"$CoMmAnDeP " set LCoMmAnDeS[3]="$ArG_ReDiR"'" C21="'"$CoMmAnDeP " set LCoMmAnDeS[4]="$ArG_ReDiR"'" C22="'"$CoMmAnDeP " set LCoMmAnDeS[5]="$ArG_ReDiR"'"' endif unset ArG_ReDiR unset En_TeTe set SaVe_Egaliser=$Egaliser_Fdeconca set Egaliser_Fdeconca=$EXIST # Afin de garantir que tous les fichiers '$ListeFichier.*' aient la meme longueur... # Fdeconca $ListeFichier $LPoStFiXeS1 # Parallelisation de la liste des fichiers en decoupant '$ListeFichier' en autant de fichiers # # qu'il y a de '$NoMbRePrOcEsS' plus 1... # set Egaliser_Fdeconca=$SaVe_Egaliser unset Egaliser_Fdeconca FileTmpB FichierT # Definition d'une liste de fichiers contenant en parallele les commandes et leurs arguments. # set NBrAnChE=1 foreach BrAnChE ($LPoStFiXeS2) if (! -e $ListeFichier$LPoStFiXeS2[$NBrAnChE]) then $CA $ListeFichier$LPoStFiXeS2[1] \ | $SE -e 's+^.*$++' \ > $ListeFichier$LPoStFiXeS2[$NBrAnChE] # En effet le dernier fichier de la liste de postfixes n'existe pas puisqu'il y a un # # postfixe de plus que la valeur de '$NoMbRePrOcEsS'. On le cree donc arbitrairement a # # partir du premier (1) en "vidant" chaque ligne... # else endif if ($NBrAnChE > 1) then @ NBrAnChE_1 = $NBrAnChE - 1 # En fait, la redirection n'a de sens qu'a partir de '$LCoMmAnDeS[2]', d'ou le "-1"... # #20090117085037____: echo "En mode 'parallele' la redirection de {'stdout','stderr'} a lieu \c" # #20090207154407____: echo "En mode 'parallele' ($NoMbRePrOcEsS branches) la redirection de {'stdout','stderr'} a lieu \c" # #20090226101118____:EchoJob "En mode \'parallele\' \($NoMbRePrOcEsS branches\) la redirection de \{\'stdout\',\'stderr\'\} \\c" # #20101229153147____: EchoJob "En mode 'parallele' ($NoMbRePrOcEsS branches) la redirection de {'stdout','stderr'} a lieu \c" # #20181011131322____: EchoJob "En mode 'parallele' ($NoMbRePrOcEsS branches) $NoMbRePrOcEsS fichiers, \c" # EchoJob "En mode 'parallele' ($NoMbRePrOcEsS branches) $NoMbRePrOcEsS fichiers, \c" #20090117085037____: echo "automatiquement vers plusieurs fichiers dont '$FReDiReCtIoN$LPoStFiXeS2[$NBrAnChE_1]'." # #20090207154407____: echo "automatiquement vers $NoMbRePrOcEsS fichiers dont '$FReDiReCtIoN$LPoStFiXeS2[$NBrAnChE_1]'." # #20090226101118____: EchoJob "a lieu automatiquement vers $NoMbRePrOcEsS fichiers \\c" # #20090226101118____: EchoJob "dont \'$FReDiReCtIoN$LPoStFiXeS2[$NBrAnChE_1]\'." # #20090613175806____: EchoJob "automatiquement vers $NoMbRePrOcEsS fichiers \c" # #20101229153147____: EchoJob "automatiquement et temporairement vers $NoMbRePrOcEsS fichiers \c" # #20101229153147____: EchoJob "dont '$FReDiReCtIoN$LPoStFiXeS2[$NBrAnChE_1]'." # #20130924163909____: EchoJob "dont '$FReDiReCtIoN$LPoStFiXeS2[$NBrAnChE_1]', sont \c" # EchoJob "dont '$FReD$LPoStFiXeS2[$NBrAnChE_1]', sont \c" EchoJob "utilises pour la redirection automatique et temporaire de {'stdout','stderr'}." else @ NBrAnChE_1 = $NBrAnChE # En fait, cette valeur est indifferente pour '$LCoMmAnDeS[1]'... # endif #20130924163909____: $CA $ListeFichier$LPoStFiXeS2[$NBrAnChE] \ # #20130924163909____: | $SE -e "s+^+$LCoMmAnDeS[$NBrAnChE]+" \ # #20130924163909____: -e "s+$ReDiReCtIoN+>> $FReDiReCtIoN$LPoStFiXeS2[$NBrAnChE_1] 2>\&1+" \ # #20130924163909____: > $FichierT$LPoStFiXeS2[$NBrAnChE] # $CA $ListeFichier$LPoStFiXeS2[$NBrAnChE] \ | $SE -e "s+^+$LCoMmAnDeS[$NBrAnChE]+" \ -e "s+$ReDiReCtIoN+>> $FReD$LPoStFiXeS2[$NBrAnChE_1] 2>\&1+" \ > $FichierT$LPoStFiXeS2[$NBrAnChE] # On notera la mise en place de redirections de type '$SHELL_BASH' puisque c'est sous ce # # "shell" que s'executeront les commandes... # unset NBrAnChE_1 @ NBrAnChE = $NBrAnChE + 1 end #20090119082722____: $PAST $FichierT* \ # #20090119082722____: | $R "$K_TAB" "$K_BLANC" \ # #20090119082722____: | $SE -e "s+ *[Cc][$Alphabet_0_9]*="'"'"$CoMmAnDe *$ArGuMeNtS *>> *$FReDiReCtIoN"'.*$++' \ # #20090119082722____: >> $ExecFichier # #20090119105236____:$PAST $FichierT* \ # #20090119105236____: | $R "$K_TAB" "$K_BLANC" \ # #20090119105236____: | $SE -e "s+ *[Cc][$Alphabet_0_9]*="'"'"$CoMmAnDeP *$ArGuMeNtS *>> *$FReDiReCtIoN"'.*$++' \ # #20090119105236____: >> $ExecFichier # # Generation d'un fichier contenant une commande par fichier repondant aux criteres, mais # # de facon parallelisee... # # # # La suppression finale de certaines commandes apparemment vides est destinee a eliminer # # certains "fantomes" provenant de l'utilisation de '$Egaliser_Fdeconca' lui-meme destine # # a donner a tous les fichiers '$FichierT*' la meme longueur permettant par la-meme la # # generation "propre" de '$ExecFichier' et de ses redirections... # #20090119105236____: FileTmpE FichierT # #20090117100347____: FileTmpE FReDiReCtIoN $NEXIST # # Nettoyage avant le retour, en notant qu'evidemment les fichiers '$FReDiReCtIoN' ne sont # # pas detruits puisqu'ils contiennent les sorties 'stdout' et 'stderr' des commandes... # endif unset BrAnChE unset NBrAnChE unset LCoMmAnDeS unset LPoStFiXeS2 unset LPoStFiXeS1 unset ReDiReCtIoN #20101012082832____: $PAST $FichierT* \ # #20101012082832____: | $R "$K_TAB" "$K_BLANC" \ # #20101012082832____: | $SE -e "s+ *[Cc][$Alphabet_0_9]*="'"'"$CoMmAnDeP *$ArGuMeNtS *>> *$FReDiReCtIoN"'.*$++' \ # #20101012082832____: >> $ExecFichier # #20130924163909____: $PAST $FichierT* \ # #20130924163909____: | $R "$K_TAB" "$K_BLANC" \ # #20130924163909____: | $SE -e "s+ *[Cc][$Alphabet_0_9]*="'"'"$CoMmAnDeP *$K_QD$ArGuMeNtS$K_QD *>> *$FReDiReCtIoN"'.*$++' \ # #20130924163909____: >> $ExecFichier # $PAST $FichierT* \ | $R "$K_TAB" "$K_BLANC" \ | $SE -e "s+ *[Cc][$Alphabet_0_9]*="'"'"$CoMmAnDeP *$K_QD$ArGuMeNtS$K_QD *>> *$FReD"'.*$++' \ >> $ExecFichier # Generation d'un fichier contenant "tout" ce qui est necessaire a l'execution de la # # commande argument sur les fichiers arguments. Voici le contenu du fichier '$ExecFichier' # # suivant les trois modes de fonctionnement : # # # # 1-"Mode Sequentiel" : # # --------------------- # # # # (...) # # TestP ; COMMANDE ARGUMENTS FICHIER(i) # # (...) # # # # pour chaque 'FICHIER(i)'. # # # # # # 2-"Mode Parallele" : # # -------------------- # # # # (...) # # TestP ; $xcg/parallele.1?$X C11="COMMANDE ARGUMENTS FICHIER(2*i+0) REDIRECT.1" # # C21="COMMANDE ARGUMENTS FICHIER(2*i+1) REDIRECT.2" # # (...) # # # # pour chaque groupe de 2 fichiers {2*i+0,2*i+1} traites en 2-parallele, ou : # # # # (...) # # TestP ; $xcg/parallele.1?$X C11="COMMANDE ARGUMENTS FICHIER(4*i+0) REDIRECT.1" # # C12="COMMANDE ARGUMENTS FICHIER(4*i+1) REDIRECT.2" # # C21="COMMANDE ARGUMENTS FICHIER(4*i+2) REDIRECT.3" # # C22="COMMANDE ARGUMENTS FICHIER(4*i+3) REDIRECT.4" # # (...) # # # # pour chaque groupe de 4 fichiers {4*i+0,4*i+1,4*i+2,4*i+3} traites en 4-parallele. # # # # # # 3-"Mode Parallele 'Linda'" : # # ---------------------------- # # # # $xcg/parallele.1?$X C11="$xcs/Linda$vv$Z LISTE REDIRECT.1" # # C21="$xcs/Linda$vv$Z LISTE REDIRECT.2" # # # # dans le cas de 2 process paralleles, ou : # # # # $xcg/parallele.1?$X C11="$xcs/Linda$vv$Z LISTE REDIRECT.1" # # C12="$xcs/Linda$vv$Z LISTE REDIRECT.2" # # C21="$xcs/Linda$vv$Z LISTE REDIRECT.3" # # C22="$xcs/Linda$vv$Z LISTE REDIRECT.4" # # # # dans le cas de 4 process paralleles, et ou 'LISTE' est le fichier contenant : # # # # (...) # # COMMANDE ARGUMENTS FICHIER(i) # # (...) # # # # pour chaque 'FICHIER(i)' (en notant bien l'absence de 'TestP', ce test de blocage etant # # fait dans 'v $xcs/Linda$vv$Z TestP' APRES l'execution de chaque commande ; au passage # # anterieurement au 20090615170127, ce test etait fait AVANT l'execution de chaque commande # # ce qui etait tres mauvais en cas d'interruption durant un 'BloqueP' puisqu'alors la # # commande courante -en attente d'execution- etait perdue et donc jamais executee...). # # # # D'une facon generale, 'REDIRECT.?' representent les redirections de type '$SHELL_BASH'... # # # # Le 20101230105622 on notera que la presence systematique de "ARGUMENTS" (qui provient # # de '$ArGuMeNtS') peut etre la cause de problemes et par exemple du message d'erreur : # # # # ls: : No such file or directory # # # # dans le cas ou '$commandeS' serait la commande 'll' et ou '$ArGuMeNtS' serait vide... # FileTmpE FichierT endif FilSTmpB ExecFichierCompact #20130923103512____:$CA $ExecFichier \ # #20130923103512____: | $SE -e "s+$xT+"'$xT+g' \ # #20130923103512____: >> $ExecFichierCompact # #20211115113239____:$CA $ExecFichier \ # #20211115113239____: | $SE -e "s+\(>> *\)$xT/+\1+g" \ # #20211115113239____: -e "s+$xT+"'$xT+g' \ # #20211115113239____: -e "s+\( \) *+\1+g" \ # #20211115113239____: -e "s+ *\(>>\) *+\1+g" \ # #20211115113239____: >> $ExecFichierCompact # if ($?FReD == $EXIST) then # Test manquant introduit le 20220112095627... # $CA $ExecFichier \ | $SE -e "s+\(>> *\)$xT/+\1+g" \ -e "s+$ListeFichier+"'$ListeFichierEnv+g' \ -e "s+`GetLeaf $FReD`+"'$FReDEnv+g' \ -e "s+$FVeRrOuB+"'$FVeRrOuBEnv+g' \ -e "s+$xT+"'$xT+g' \ -e "s+\( \) *+\1+g" \ -e "s+ *\(>>\) *+\1+g" \ >> $ExecFichierCompact else $CA $ExecFichier \ >> $ExecFichierCompact endif # Ceci est destine a compacter le ficher '$ExecFichier' de facon a reduire les risques # # d'avoir le message : # # # # Word too long. # # # # lors du 'source' a venir, comme cela s'est vu sur '$CMAP28' ("abbesses.polytechnique.fr") # # avec le test : # # # # setenv ProcessorNumber 12 # # $xcg/FindExec.01$Z $xi $FON echo # # # # la veille du 20130923095721... # # # # Malheureusement, je note le 20130923103512 que cela ne sert a rien car, en effet, la # # chaine definie par l'argument 'v $xcg/parallele.1N$X commande=' est expansee avec la # # valeur des differentes variables et c'est la longueur apres expansion qui est trop # # grande et rien n'y fait ! # # # # En fait, une solution partielle fut d'introduire le 20130923103512 : # # # # xT # # # # en tete de '$ExecFichier' et de supprimer '$xT' dans toute les redirections... # set VaLiDeCompact=`$CA $ExecFichierCompact | $GRE -v '^#' | $GRE -v '^ *$' | $SE -e "s/^.* commande=//" -e 's/"//g' | $WCc` #20250107122124____:set SVaLiDeCompact=4000 # set SVaLiDeCompact=4095 if ($VaLiDeCompact > $SVaLiDeCompact) then # En fait, il doit s'agir de 4096 (test introduit le 20130923101807...). # #20160610102029____:EROR "La commande a executer est trop volumineuse (plus de $VaLiDeCompact octets) et ne pourra donc s'executer." # EROR "La commande a executer est tres volumineuse ($VaLiDeCompact octets, soit plus de $SVaLiDeCompact) \c" echo "et ne pourra peut-etre donc pas s'executer correctement." # Le 20160610102029, je note que sur '$CMAP28 ex(1) "porte-brancion"' avec 162819 octets # # tout semble bien se passer... # # # # Le 20211115113239, je note que le compactage via {$ListeFichierEnv,$FReDEnv,$FVeRrOuBEnv} # # ci-dessus va tres certainement faire disparaitre l'apparition de ce message... # if ($?FindExec_Parallele == $EXIST) then if ($FindExec_Parallele == $NEXIST) then EROR "Cela doit etre du au fait que le parallelisme est bloque par '$K_DOLLAR""FindExec_Parallele'." else endif else endif else endif unset SVaLiDeCompact unset VaLiDeCompact FilSTmpE ExecFichier #20130923095721____:ro $ExecFichier # ro $ExecFichierCompact # En general, on aura ici dans '$ExecFichierCompact' quelque chose du genre : # # # # xT # # $xcg/parallele.1N$X parallele_14=FAUX \ # # commande="$xcs/Linda$vv$Z FICHIERS..." # # # # ou 'FICHIERS' designe d'une part le fichier des commandes a executer, le verrou et le # # fichier de type 'sortie', le tout repete N fois (avec un "#" de separation)... # #20130923095721____:eval "(source $ExecFichier) $GJobRedirection" # eval "(source $ExecFichierCompact) $GJobRedirection" # On notera que c'est ce 'source' qui execute les commandes de '$ExecFichier' et ce quel # # que soit le mode (parallele ou sequentiel...). # # # # Test introduit le 20090207142031 afin de garantir (du moins je l'espere) l'ordre des # # lignes du fichier genere lors de 'v $xcc/RecompileAll$Z'... # # # # On notera le 20090209092816 l'explication d'un defaut de tabulation lors de tests utilisant # # la commande : # # # # $xcg/FindExec.01$Z $xbg $X "$LL" # # # # ('$xbg' par exemple). Les sorties sont alors mal tabulees a partir de la colonne de la # # taille des fichiers. La raison en est evidente ; la commande precedente n'est pas # # equivalent a : # # # # $LL $xbg/*$X # # # # En effet, dans le second cas ('$LL' global), la commande '$LL' connait la taille du plus # # grand fichier (parmi la liste '$xbg/*$X'), d'ou la bonne tabulation. Alors que dans le # # premier cas, '$LL' est active fichier par fichier et cette taille maximale n'est plus # # connue... # #20130923095721____:FilSTmpE ExecFichier # FilSTmpE ExecFichierCompact FileTmpE ListeFichier # Nettoyage avant le retour. # #20130924163909____:if ($?FReDiReCtIoN == $EXIST) then # if ($?FReD == $EXIST) then # Sequence introduite le 20090117100347... # #20090208101943____: if ($?JobRedirection == $EXIST) then # #20090207154407____: echo "Ces $NoMbRePrOcEsS fichiers de redirection sont concatenes ci-apres :" # #20090207154407____: saut # #20090207154407____: saut # #20090208101943____: EchoJob "Ces $NoMbRePrOcEsS fichiers de redirection sont concatenes ci-apres :" # #20090208093422____: EcHoR "" # #20090208093422____: EcHoR "" # # Message introduit le 20090117113902... # #20090208101943____: eval "$CA $FReDiReCtIoN* $GJobRedirection" # # Ainsi, on genere le fichier resultat attendu (introduit le 20090117101212). # #20090208101943____: else # #20090208101943____: endif # if ($FindExec_MessagesBP == $EXIST) then # Test introduit le 20150205105239... # saut 2 # Introduit le 20090613175806... # #20090226101118____: EchoJob "Ces $NoMbRePrOcEsS fichiers de redirection sont concatenes ci-apres :" # #20090613175806____: EchoJob "Ces $NoMbRePrOcEsS fichiers de redirection sont concatenes ci-apres :" # #20101230102551:EchoJob "A la fin des processus paralleles, ces $NoMbRePrOcEsS fichiers de redirection sont concatenes ci-apres :" # EchoJob "A la fin des processus paralleles, ces $NoMbRePrOcEsS fichiers de redirection sont concatenes ci-apres \c" #20130924161905____: echo "(la chronologie n'etant donc pas respectee...) :" # echo "(la chronologie des differentes operations effectuees en parallele n'etant donc pas respectee...) :" saut 2 # Introduit le 20090613175806... # source $xo/RecherchG$vv$Y saut 4 # Introduit le 20230228125711... # else endif #20130924163909____: eval "$CA $FReDiReCtIoN* $GJobRedirection" # eval "$CA $FReD* $GJobRedirection" # Ainsi, on genere le fichier resultat attendu (introduit le 20090117101212). # #20130924163909____: FileTmpE FReDiReCtIoN $NEXIST # FileTmpE FReD $NEXIST # Nettoyage avant le retour, en notant qu'evidemment les fichiers '$FReDiReCtIoN' ne sont # # pas detruits puisqu'ils contiennent les sorties 'stdout' et 'stderr' des commandes... # else endif if ($?FVeRrOuB == $EXIST) then # Sequence introduite le 20090317101238... # FilSTmpE FVeRrOuB # Nettoyage avant le retour... # else endif