#!/bin/csh ####################################################################################################################################### # # # E X E C U T I O N D E L A P R E M I E R E C O M M A N D E D U # # F I C H I E R A R G U M E N T E T S U P P R E S S I O N : # # # # # # Utilisation : # # # # $xcs/Linda$vv$Z <fichier_mode_ro> [<VerrouBlocage> [<TaillePaquets> [<FEnvironnement>]]] # # # # # # Nota : # # # # Le 20121227122556 fut introduite la # # variable d'environnement : # # # # setenv TaillePaquetsLinda (...) # # $xcs/Linda$vv$Z (...) # # unsetenv TaillePaquetsLinda # # # # qui permet donc "de l'exterieur" de forcer # # la valeur par defaut de '$TaillePaquets'... # # # # # # Le 20150205095655 fut introduite la # # variable d'environnement : # # # # setenv SLinda $NEXIST # # $xcs/Linda$vv$Z (...) # # unsetenv SLinda # # # # qui permet donc de ne pas forcer la commande 'S' # # definissant un certain nombres d'alias et # # de variables utiles. # # # # # # Author of '$xcs/Linda$vv$Z' : # # # # Jean-Francois Colonna (LACTAMME, 20090119090300). # # # ####################################################################################################################################### set Fichier_mode_ro=$1 # ATTENTION : le mode de '$Fichier_mode_ro' doit etre 'ro' mais il est malheureusement # # impossible de le verifier puisque plusieurs versions de '$xcs/Linda$vv$Z' peuvent # # s'executer simultanement (alors qu'elles font des {rwv,rov}...). # set VerrouBlocage=$2 # Argument introduit le 20090316102934 qui s'il est present designe un fichier qui permet # # de bloquer la commande courante ('$CoMmAnDe') avant son execution. ATTENTION : evidemment # # s'il plusieurs occurences de '$xcs/Linda$vv$Z' il est absolument essentiel que pour eviter # # un blocage generalise, il y ait autant de fichiers '$VerrouBlocage's differents qu'il y a # # d'occurences de '$xcs/Linda$vv$Z'... # set TaillePaquets=$3 # Argument introduit le 20110523210538 pour 'v $Falias_catalf .xcs.Linda.vv.Z'. En effet, # # lorsque les commandes a executer sont breves, voire tres breves (comme c'est le cas en # # moyenne pour 'v $Falias_catalf .xcs.Linda.vv.Z'), afin de contrebalancer le "cout" de # # la gestion du parallelisme, il est preferable de regrouper ces commandes par paquets... # set FEnvironnement=$4 # Argument introduit le 20110524085419 pour 'v $Falias_catalf .xcs.Linda.vv.Z' et essentiel # # dans le cas ou '$Fichier_mode_ro' reference des alias et/ou des variables "specifiques" # # (c'est-a-dire ne faisant pas partie de l'environnement...). # if ("$TaillePaquets" == "$K_VIDE") then #20111218093147____: set TaillePaquets=1 # #20121227122556____: set TaillePaquets=1 # # Valeur par defaut... # if ($?TaillePaquetsLinda == $EXIST) then set TaillePaquets=$TaillePaquetsLinda # Valeur par defaut introduite sous cette forme le 20121227122556... # else #20191213105854____: set TaillePaquets=1 # # Valeur par defaut... # if ($?TaillePaquetsDiviseur == $NEXIST) then # Test introduit le 20191213134627... # #20200307101330____: setenv TaillePaquetsDiviseur 8 # setenv TaillePaquetsDiviseur 4 # On notera le 20191213132147 la valeur arbitraire de '$TaillePaquetsDiviseur'. Plus celle-ci # # est grande et plus les paquets sont petits. On notera au passage que plus cette valeur est # # proche de 1, plus cela fait l'hypothese que la duree d'execution est a peu pres le meme # # pour tous les paquets... # else endif set TailleFichier_mode_ro=`$CA $Fichier_mode_ro | $WCl` set TaillePaquets=`calculINS ($TailleFichier_mode_ro/$ProcessorNumber)/$TaillePaquetsDiviseur` set TaillePaquets=`$xcg/MAX2.01$X a=1 b=$TaillePaquets signe="$K_VIDE"` unset TailleFichier_mode_ro # Introduit le 20191213102418 afin de favoriser l'usage de "paquets" de commandes ce qui # # permet, lorsque ces commandes s'executent tres rapidement, de reduire l'"overhead" de # # gestion du parallelisme... # #20191213134627____: unset TaillePaquetsDiviseur # endif if (-e $Fichier_mode_ro) then #20120114112420____: set EsT_Ce__Gserveur=`$CA $Fichier_mode_ro | $EGRE -e "^Gserveur |^$xiMo/Gserveur$Z " | $HEA -1` # set EsT_Ce__Gserveur=`$CA $Fichier_mode_ro | $EGRE -e "^ *Gserveur |^ *$xiMo/Gserveur$Z "'|^ *\$xiMo/Gserveur\$Z ' | $HEA -1` #20120114112420____: set EsT_Ce__creation_Z=`$CA $Fichier_mode_ro | $EGRE -e "^$xiMo/recreation$Z " | $HEA -1` # set EsT_Ce__creation_Z=`$CA $Fichier_mode_ro | $EGRE -e "^ *$xiMo/recreation$Z "'|^ *\$xiMo/recreation\$Z ' | $HEA -1` if ( ("$EsT_Ce__Gserveur" != "$K_VIDE") \ || ("$EsT_Ce__creation_Z" != "$K_VIDE") \ ) then #20120509181951____: set TaillePaquets=20 # #20140525091811____: set TaillePaquets=8 # set TaillePaquets=1 # Introduit le 20111218093147 afin d'ameliorer le parallelisme de certaines commandes dont # # les temps d'execution sont brefs et surtout quasiment constants, ce qui fait que les # # differentes branches paralleles ont tendance a se synchroniser et donc se "gener" # # mutuellement lors de l'acces au fichier '$Fichier_mode_ro'. On introduit donc ici un # # peu d'heuristique... # # # # On notera le 20120509155437 que pour la generation des petits diaporamas (tel celui qui # # est associe a 'v $xiMt/Galerie_Astrophysics$vv.$m4.$I') il n'y aura donc pas d'execution # # parallele. Peut-etre faudrait-il diminuer la valeur 20 (10 ou moins ?) ? Le 20120509181951 # # je passe de 20 a 8 pour voir... # # # # A cause de 'v $xiMt/ComplexiteStructurelle.Recursive.01.$m4.$I' dont le 'Gserveur' # # correspondant ('v $xiMd/ComplexiteStructurelle.Recursive.01$m4') est tres long, le # # 20140525091811 je reviens a 1 pour voir... # else #20121227122357____: set TaillePaquets=1 # endif unset EsT_Ce__Gserveur unset EsT_Ce__creation_Z else #20121227122357____: set TaillePaquets=1 # # Pas tres utile, mais on ne sait jamais... # endif else endif if ($?SLinda == $NEXIST) then #20150205104741____: setenv SLinda $NEXIST # setenv SLinda $EXIST # Valeur par defaut introduite le 20150205095655... # else endif if (-e $Fichier_mode_ro) then #20150205104329____: if ( ("$mHOTE" == "$mDev_WWW") \ # #20150205104329____: || ($sHOTE == $sPORTABLE_1) \ # #20150205104329____: || ($sHOTE == $sPORTABLE_2) \ # #20150205104329____: || ($sHOTE == $sPORTABLE_3) \ # #20150205104329____: || ($sHOTE == $sPORTABLE_4) \ # #20150205104329____: || ($sHOTE == $sPORTABLE_5) \ # #20150205104329____: ) then # #20150205104329____: if (-e $xiMo/serveur.01$vv$Y) then # #20150205104329____: set NoCheckServeur=$EXIST # #20150205104329____: source $xiMo/serveur.01$vv$Y # #20150205104329____: unset NoCheckServeur # # Et ce afin de pouvoir disposer d'alias du type 'Gserveur' sur '$mDev_WWW'. # #20150205104329____: else # #20150205104329____: endif # #20150205104329____: else # #20150205104329____: endif # if ($SLinda == $EXIST) then PushdC $xrC set No_Sdu=$EXIST S unset No_Sdu # L'introduction de 'S' le 20150205095655 a implique la modification du 20150205104329 # # ci-dessus... # PopdC else endif set BoUcLeR=$EXIST while ($BoUcLeR == $EXIST) #20090522162205____: rwv $Fichier_mode_ro >& $nul # set rwv_NoMes=$EXIST set PhasCriB_NoMesUtil=$EXIST #20110524131848____: set TeMpO_PhasCriB=0.002 # #20110528101359____: set TeMpO_PhasCriB=0.02 # # Aux environs du 20110528101359 j'ai fait des experiences concernant la valeur de # # '$TeMpO_PhasCriB'. Contrairement a ce que je croyais naivement, une valeur nulle # # n'accelere pas le processus et la valeur '0.02' ('v $Fvariables pTEMPORISATION') # # semble etre une bonne valeur. Malgre tout ces experiences ont montre que le "cout" du # # parallelisme etait eleve pour 110 '$xcg/fichier_etat$X tout=VRAI' des '$X' de '$xrv' : # # si le fichier correspondant est "source", il faut 5 secondes ("a la montre") contre 60 # # en mode '$xcs/Linda$vv$Z' sur '$LACT18'... La question qui se pose est de savoir ou se # # situe le "cout" ci-apres : en fait 40% du temps (dans le cas du test precedent) est # # utilise par {rwv,rov}, le 'SourceTmp' de {PhasCriB,PhasCriE} en etant responsable. # rwv $Fichier_mode_ro #20110524131848____: unset TeMpO_PhasCriB # unset PhasCriB_NoMesUtil unset rwv_NoMes # Appropriation du fichier '$Fichier_mode_ro'... # # # # La modification du 20090522162205 est due au probleme 'v $Falias_PhasCriB 20090522111309'. # # Le 20090522163157, fut introduit '$rwv_NoMes' suite a la modification du 20090522162205... # # # # Je note le 20100315101519 que c'est la chaine de commandes : # # # # rwv --> PhasCriB # # # # qui est responsable du 'sleep' d'une duree de '$TEMPORISATION' ou '$pTEMPORISATION'... # # # # On notera que l'on pourrait positionner '$TeMpO_PhasCriB' afin de reduire la duree des # # 'sleep's et donc accelerer (peut-etre...) le processus... # #20110523210853____: SIZE $Fichier_mode_ro # #20110523210853____: set SiZe_Fichier=$Fsize # set SiZe_Fichier_Avant=`$CA $Fichier_mode_ro | $WCl` if (-e $xcg/MIN2.01$X) then # Test introduit le 20170403105900 car, en effet, '$xcg/MIN2.01$X' peut etre inexistant de # # facon temporaire si justement 'v $xcs/Linda$vv$Z' sert en ce moment a faire des # # compilations et que 'v $xcg/MIN2.01$K' est en cours de compilation... # set SiZe_Fichier=`$xcg/MIN2.01$X a=$SiZe_Fichier_Avant b=$TaillePaquets entier=VRAI signe="$K_VIDE"` # Le 20120713133554 le nom 'SiZe_Fichier' a ete complete par 'SiZe_Fichier_Avant' afin de # # pouvoir valider la suppression des premieres lignes via '$SuPpReSs'. En effet, aux environs # # de cette date, sur '$CMAP28' (ex(1) "grenelle"), lors de l'execution de : # # # # job $xiMo/ReGENEREAll$Z $EXIST $NEXIST $NEXIST $NEXIST $NEXIST # # # # la page 'v $xiMd/relai_universel.01$vv$m4' a ete generee quasiment simultanement dans deux # # branches paralelles. Dorenavant, on verifiera que '$SuPpReSs' a bien detruit des lignes et # # qu'ainsi la longueur du fichier '$Fichier_mode_ro' a bien diminue... # else EROR "La commande '"'$xcg/MIN2.01$X'"' n'existe pas." #20170404033231____: set SiZe_Fichier=$SiZe_Fichier_Avant # if ($SiZe_Fichier_Avant < $TaillePaquets) then # Test emulant le '$xcg/MIN2.01$X' introduit le 20170404033231... # set SiZe_Fichier=$SiZe_Fichier_Avant else set SiZe_Fichier=$TaillePaquets endif endif if ($SiZe_Fichier > 0) then FilSTmpB CoMmAnDe $Y # Creation d'un fichier temporaire contenant la commande a executer. # $CA $xcs/csh$Y \ >> $CoMmAnDe # Initialisation du fichier temporaire '$CoMmAnDe'... # if ("$FEnvironnement" != "$K_VIDE") then if (-e $FEnvironnement) then $CA $FEnvironnement \ >> $CoMmAnDe # Possibilite introduite le 20110524085419 permettant donc d'executer dans : # # # # source $CoMmAnDe # # # # ci-apres des commandes qui sont, par exemple, des alias avec des variables. Ceci est # # utilise dans 'v $Falias_catalf .Falias_catalf_1' ou la commande executee est l'alias # # 'EdItE'... # else EROR "Le fichier '"$FEnvironnement"' n'existe pas." endif else endif $CA $Fichier_mode_ro | \ $HEA --lines $TaillePaquets \ >> $CoMmAnDe # Recuperation de l'instruction courante... # if ($TaillePaquets > 1) then FilSTmpB SuPpReSs $Y # Creation d'un fichier temporaire contenant la commande de suppression de '$TaillePaquets' # # lignes en tete de '$Fichier_mode_ro'... # $CA $xcs/csh$Y \ >> $SuPpReSs # Initialisation du fichier temporaire '$CoMmAnDe'... # echo "$E $Fichier_mode_ro << Fin_Delete >& $nul" \ >> $SuPpReSs echo "1,$SiZe_Fichier""d" \ >> $SuPpReSs echo "w" \ >> $SuPpReSs echo "q" \ >> $SuPpReSs echo "Fin_Delete" \ >> $SuPpReSs # Tout ceci est du au fait que l'on ne peut pas parametrer par des variables les lignes # # entrees via "<<...". On notera que l'on ne peut ecrire : # # # # "1,$TaillePaquets""d" # # # # car, en effet, a la fin du processus, dans le cas ou l'on a strictement : # # # # $SiZe_Fichier < $TaillePaquets # # # # alors '$E' refuse de detruire les dernieres (toutes...) lignes de '$Fichier_mode_ro'... # source $SuPpReSs # Suppression de l'instruction courante... # FilSTmpE SuPpReSs else # Dans le cas ou les paquets contiennent une seule instruction, on optimise (pour une # # fois...) en evitant la lourdeur du code ci-dessus... # $E $Fichier_mode_ro << Fin_Delete >& $nul 1d w q Fin_Delete # Suppression de l'instruction courante... # # # # Afin d'eviter des problemes du type 'v $Fcommandes SYSTEME_FX2800_CONCENTRIX', le # # 20090120092015 j'ai essaye de supprimer la premiere ligne de '$Fichier_mode_ro' via : # # # # FileTmpB TeMpOrAiRe # # $CA $Fichier_mode_ro | \ # # $TAI --lines +2 \ # # >> $TeMpOrAiRe # # $DELETE $Fichier_mode_ro # # $MV $TeMpOrAiRe $Fichier_mode_ro # # FileTmpE TeMpOrAiRe $NEXIST # # # # Malheureusement, cela ne marche pas a cause du '$DELETE $Fichier_mode_ro' qui fait que # # de temps en temps '$Fichier_mode_ro' n'existe pas ce qui "perturbe" d'autres occurences # # paralleles de '$xcs/Linda$vv$Z'... # endif set SiZe_Fichier_Apres=`$CA $Fichier_mode_ro | $WCl` # Introduit le 20120713134302 afin de valider l'execution de '$SuPpReSs' ci-dessus... # if ($SiZe_Fichier_Apres == $SiZe_Fichier_Avant) then # Tests introduits le 20120713134302... # EROR "Le fichier '"$Fichier_mode_ro"' n'a pas change de taille." else if ($SiZe_Fichier_Apres > $SiZe_Fichier_Avant) then EROR "Le fichier '"$Fichier_mode_ro"' vient de grossir en passant \c" ECHO "de $SiZe_Fichier_Avant a $SiZe_Fichier_Apres octets." else endif endif unset SiZe_Fichier_Apres else endif rov $Fichier_mode_ro >& $nul # Liberation du fichier '$Fichier_mode_ro'... # if ($SiZe_Fichier > 0) then #20151022112745____: source $CoMmAnDe # (source $CoMmAnDe) # Execution de la commande courante (qui n'est donc plus dans le fichier argument). # # # # Le 20090615170127, l'execution de la commande courante a ete placee devant l'eventuel # # blocage par verrouillage a cause de 'v $xcg/FindExec.01$Z ListeFichierA' qui permet une # # reprise d'un travail sous 'Linda' aborte pendant un 'BloqueP'. Ainsi, si '$xcs/Linda$vv$Z' # # est aborte pendant le 'TestP', il est essentiel que la commande courante ait deja ete # # executee puisqu'elle a deja ete supprimee de la liste '$Fichier_mode_ro' (dans le cas # # contraire -correspondant a la situation anterieure au 20090615170127- cette commande # # courante n'etait jamais executee !). # # # # La mise entre parentheses du 'source' le 20151022112745 est destinee a eviter des conflits # # entre les variables locales (de '$xcs/Linda$vv$Z') et celles qui seront utiles dans le # # fichier '$CoMmAnDe'. Cela s'est vu avec la variable '$CoMmAnDe' dans l'alias 'execXYZ' # # lors de la mise au point de l'image 'v $xiirc/LYAP.M3$HauteDef.21'. En effet cette # # variable '$CoMmAnDe' apparait aussi ici, ci-dessus... # FilSTmpE CoMmAnDe if ("$VerrouBlocage" != "$K_VIDE") then if (-e $VerrouBlocage) then TestP $VerrouBlocage # Introduit le 20090316102934 pour permettre de bloquer la '$CoMmAnDe' courante avant son # # execution... # else EROR "Le fichier de blocage '"$VerrouBlocage"' n'existe pas." endif else endif #20090615170127____: source $CoMmAnDe # # Execution de la commande courante (qui n'est donc plus dans le fichier argument). # #20090615170127____: FilSTmpE CoMmAnDe # else set BoUcLeR=$NEXIST # On arrete car il n'y a plus rien a faire... # endif unset SiZe_Fichier unset SiZe_Fichier_Avant end unset BoUcLeR else EROR "Le fichier '"$Fichier_mode_ro"' n'existe pas." endif