Ignore:
Timestamp:
07/19/12 16:02:21 (12 years ago)
Author:
aclsce
Message:

Modifications done by Guillaume P :

  • error handling for the whole script
  • check of nco version
  • restart tool for list script
  • progress visualization for both scripts
  • "force" option -f added for both scripts
  • timing information added for pack script
File:
1 edited

Legend:

Unmodified
Added
Removed
  • TOOLS/PACK_IPSL/DEM_utilities.sh

    r1729 r1822  
    132132} 
    133133 
     134# gpdebug : fonctions de gestion des erreurs ######################################################## 
     135function DEM_errorSend { 
     136    # Envoi d'un msg d'erreur au programme principal.  
     137    # Suppression des processus du programme principal au fils emetteur de l'erreur 
     138     
     139    echo "########## DEM_errorSend : Error detected ==> Sending an error..." 
     140     
     141    msgToSend=${1} 
     142    listPIDtoKill=${2} 
     143    if [ "x${listPIDtoKill}" == "x" ] 
     144    then 
     145        listPIDtoKill=${listPID} 
     146    fi 
     147    # -------------------------------- 
     148    # Verif du format de listPIDtoKill 
     149    # -------------------------------- 
     150    listPIDformat='^[[:digit:]]*\([[:blank:]][[:digit:]]*\)*$' 
     151    isListPIDformatOK=`echo ${listPIDtoKill} | grep -e ${listPIDformat} | wc -l ` 
     152    if [ "x$isListPIDformatOK" == "x0" ] 
     153    then 
     154       echo "      Attention : le format de la liste de PID est incorrecte :" 
     155       echo "      $listPIDtoKill" 
     156       kill -TERM ${listPID} 
     157    fi 
     158 
     159     
     160    # ----------------------------------- 
     161    # Verif du Format du ${msgToSend} 
     162    # ----------------------------------- 
     163    errorFormat='^[^:]*\.sh:[[:digit:]]*:.*$' 
     164    isErrorFormatOK=`echo ${msgToSend} | grep -e ${errorFormat} | wc -l ` 
     165    if [ "x$isErrorFormatOK" == "x0" ] 
     166    then 
     167       echo "      Attention : le format du message d'erreur est incorrect :" 
     168       echo "      $msgToSend" 
     169    fi 
     170     
     171    # Envoi du msg dans le fichier d'erreur 
     172    # ------------------------------------- 
     173    #    test sur la var contenant le nom du fichier d'erreur 
     174    if [ "x${errorMsgFile}" != "x${PWD}/errorMsg.txt" ] 
     175    then 
     176        echo "      Le fichier d'erreur a un nom incorrect" 
     177    fi 
     178     
     179    echo $msgToSend > $errorMsgFile 
     180     
     181    echo "killing ${listPIDtoKill}" 
     182    kill -TERM ${listPIDtoKill} 
     183     
     184    exit -1 # utile : sinon le script qui appelle cette fonction continue un peu l'exec --> pas propre 
     185} 
     186 
     187function DEM_errorReceive { 
     188    # Récupération et affichage du msg d'erreur emis par un processus fils  
     189     
     190    # Lecture du msg dans le fichier d'erreur 
     191    # --------------------------------------- 
     192    #    test sur la var contenant le nom du fichier d'erreur 
     193    if [ "x${errorMsgFile}" != "x${PWD}/errorMsg.txt" ] 
     194    then 
     195       echo "      Le fichier d'erreur a un nom incorrect" 
     196       exit -1   
     197    fi 
     198     
     199    #    Lecture     
     200    errorReceived=`cat $errorMsgFile ` 
     201     
     202    # ----------------------------------- 
     203    # Verif du Format du ${errorReceived} 
     204    # ----------------------------------- 
     205    errorFormat='^[^:]*\.sh:[[:digit:]]*:.*$' 
     206    isErrorFormatOK=`echo ${errorReceived} | grep -e ${errorFormat} | wc -l ` 
     207    if [ "x$isErrorFormatOK" == "x0" ] 
     208    then 
     209       echo "      Attention : le format du message d'erreur est incorrect :" 
     210       echo "      $errorReceived" 
     211       exit -1 
     212    fi 
     213     
     214    echo "########## DEM_errorReceive : $SCRIPT_NAME received an error..." 
     215    echo $errorReceived 
     216     
     217    # echo "Current PID:$$" 
     218    # echo "FatherPID:$FatherPID" 
     219    # On fait un bilan de la progression seulement si c'est une erreur bloquante : lorsque le proc pere est tue. 
     220    if [ "x${FatherPID}" == "x$$" ] 
     221    then 
     222        ./showListsProgress.sh $FileParam 
     223    fi 
     224        
     225    exit -1  
     226} 
     227 
     228# Verification de la version de nco chargee 
     229function check_nco_version 
     230{ 
     231   # nom du présent prog (pour gestion des erreurs)  
     232   PROGNAME="DEM_utilities.sh" ######### 
     233   . /etc/profile  
     234   module list >& myModuleList.txt 
     235    
     236   if [ "x$?" != "x0" ] 
     237   then 
     238       # echo "La commande module list a rencontre un pb !" 
     239       DEM_errorSend "${PROGNAME}:${LINENO}:La commande module list a rencontre un pb !" 
     240   fi 
     241    
     242   if [ ! -e myModuleList.txt ] 
     243   then 
     244       # echo "Le fichier 'myModuleList.txt'  n existe pas" 
     245       DEM_errorSend "${PROGNAME}:${LINENO}:Le fichier 'myModuleList.txt' n'existe pas." 
     246   fi    
     247    
     248   # Presence de la chaine "n) nco/" ou n est un nombre   
     249   ncoLines=` grep -e '[[:digit:]]*) nco/' myModuleList.txt ` 
     250   # ncoLines=` grep -e '[[:digit:]]*) nco/' moduleList.txt ` 
     251   # echo "ncoLines=${ncoLines}|" 
     252   # echo "----------------------------------------" 
     253 
     254   # Plus besoin du myModuleList.txt 
     255   rm -f myModuleList.txt 
     256  
     257   # La chaine "nco" est remplacee par le caractere "#" 
     258   temp1=`echo $ncoLines | sed 's;nco;#;g' ` 
     259   # echo "$temp1" 
     260   # echo "----------------------------------------" 
     261 
     262   # On supprime tout ce qui n'est pas "n) #/..." avec n un nombre et "..." une chaine sans blanc  
     263   temp2=`echo $temp1 | sed 's;[[:blank:]]*[[:digit:]]*) [^#][^[:blank:]]*;;g' ` 
     264   # echo "$temp2" 
     265   # echo "----------------------------------------" 
     266 
     267 
     268   # Recuperation du numero de version du nco au format x.y.z 
     269   # C'est une liste de num de version (a priori ici, il pourrait y en avoir plusieurs,  
     270   # mais dans les faits, les nco s'excluent les uns les autres) 
     271   temp3=`echo $temp2 | sed 's;[[:blank:]]*[[:digit:]]*) #/;|;g' ` 
     272   temp3=`echo $temp3 | sed 's;^|;;g' ` 
     273   temp3=`echo $temp3 | sed 's;|; ;g' ` 
     274   # echo "$temp3" 
     275   # echo "----------------------------------------" 
     276    
     277   # comptage du nombre de nco 
     278   versionNCO= 
     279   count=0 
     280   for ver in $temp3 
     281   do 
     282     # echo "ver=$ver" 
     283     versionNCO=$ver 
     284     count=$(( $count + 1 )) 
     285   done 
     286   # echo "count=$count" 
     287    
     288   # si aucun nco n'est charge, on sort. 
     289   if [ $count -eq 0 ] 
     290   then 
     291     # echo "nco pas charge" 
     292     DEM_errorSend "${PROGNAME}:${LINENO}:Aucun nco n'est charge" 
     293   fi 
     294    
     295   # si plus d'un nco sont charges, on sort (n'arrive jamais en pratique). 
     296   if [ $count -gt 1 ] 
     297   then 
     298     DEM_errorSend "${PROGNAME}:${LINENO}:Au moins 2 versions de nco sont chargees" 
     299   fi 
     300    
     301   # Si un seul nco est charge, on supprime les "." de son numero de version (x.y.z ==> xyz) 
     302   verNCOnumber=`echo $versionNCO | sed 's;[^[:digit:]];;g' ` 
     303   # echo "versionNCO=$versionNCO" 
     304    
     305   # On verifie que xyz est un nombre a 3 chiffres 
     306   if ! [[ "$verNCOnumber" =~ ^[0-9]\{3\}$ ]] 
     307   then 
     308      # echo "verNCOnumber is not a number" 
     309      DEM_errorSend "${PROGNAME}:${LINENO}:La variable verNCOnumber n'est pas un nombre --> $verNCOnumber" 
     310   fi 
     311    
     312    
     313   # On verifie que le num de version est >= 4.1.0 
     314   if [ $verNCOnumber -lt 410 ] 
     315   then 
     316       # echo "version < 4.1.0 . STOP." 
     317       DEM_errorSend "${PROGNAME}:${LINENO}:La version de nco < 4.1.0 ==> $versionNCO" 
     318   fi 
     319    
     320   echo "La version de nco chargee est : $versionNCO" 
     321    
     322} 
     323 
     324function prepareMonitoringDir 
     325{ 
     326   # nom du présent prog (pour gestion des erreurs)  
     327   PROGNAME="DEM_utilities.sh" ######### 
     328    
     329   MonitoringDirDefined=`echo $MonitoringDir | grep "SuiviListes" | wc -l ` 
     330   if [ "x${workFlowDirDefined}" == "x0" ] 
     331   then 
     332      DEM_errorSend "${PROGNAME}:${LINENO}:Le repertoire de suivi est mal defini." 
     333   fi 
     334    
     335   #  Si l'option de forcage de toute les etapes est activee, 
     336   #  on vide le fichier 
     337   if [ "x${execEveryStep}" == "x1" ] 
     338   then 
     339      echo "${MonitoringDir}:destruction..." 
     340      rm -rf ${MonitoringDir} 
     341   fi 
     342    
     343   # Si le rep de suivi n'existe pas, on le créé. 
     344   if [ ! -d ${MonitoringDir} ] 
     345   then 
     346      mkdir ${MonitoringDir} 
     347   fi 
     348 
     349} 
     350 
     351function generalMonitoring 
     352 
     353   # Si l'etape courante a ete executee (correctement), on sort du script appelant cette fonction 
     354    
     355   # nom du présent prog (pour gestion des erreurs)  
     356   PROGNAME="DEM_utilities.sh" ######### 
     357    
     358   currentStep=${1} 
     359    
     360   stepMsg=`echo $currentStep | grep -e '^.*\.sh-->OK$' | wc -l ` 
     361   if [ "x{stepMsg}" == "x0" ] 
     362   then 
     363      DEM_errorSend "${PROGNAME}:${LINENO}:Le nom de l'etape courante n'est pas au bon format !" 
     364   fi 
     365    
     366   currentStepScriptName=`echo $currentStep | sed 's;\.sh-->OK;;' ` 
     367    
     368   # si le fichier de suivi general n'existe pas, il n'y a pas eu de passage de script de liste avant. 
     369   # ==> on sort normalement 
     370   if [ ! -e ${generalMonitorFile} ] 
     371   then 
     372      return 0 
     373   fi 
     374    
     375   currentStepPassed=`grep ${currentStep} ${generalMonitorFile} | wc -l ` 
     376       
     377   if [ "x${currentStepPassed}" != "x0" ] 
     378   then 
     379      echo "${currentStepScriptName} a deja ete passee ..." 
     380      exit 0 
     381   fi 
     382 
     383} 
     384 
     385function createListingMonitoring_Check 
     386{ 
     387    
     388   # La presence de createListingOK.txt dans le sous rep (associe a un rep de param_AC.txt) du rep de suivi 
     389   # indique que le bon deroulement de l'action de create_listing.sh sur le repertoire de param_AC.txt 
     390   DIR=$(basename ${1})    
     391   MonitSubDir=${MonitoringDir}/${DIR} 
     392    
     393   createListingOK=${MonitSubDir}/createListingOK.txt 
     394    
     395   if [ -e $createListingOK ] 
     396   then 
     397      echo "create_listing a deja ete passe pour ${DIR}..." 
     398      exit 0       
     399   fi    
     400 
     401} 
     402 
     403function createListingMonitoring_OK 
     404{ 
     405    
     406   # A partir du nom du rep courant (contenant des res de simulation), creation d'un sous rep de suivi 
     407   DIR=$(basename ${1}) 
     408   MonitSubDir=${MonitoringDir}/${DIR} 
     409   mkdir $MonitSubDir 
     410    
     411   # dans ce sous rep de suivi, creation d'un fichier dont la presence indique le bon deroulement 
     412   # de l'action de create_listing.sh sur le repertoire en argument (celui contenant des simus)  
     413   createListingOK=${MonitSubDir}/createListingOK.txt   
     414   touch $createListingOK   
     415 
     416} 
     417 
     418function simuMonitoring_check 
     419{ 
     420   # nom du présent prog (pour gestion des erreurs)  
     421   PROGNAME="DEM_utilities.sh" ######### 
     422    
     423   currentStep=${1} 
     424   config=${2} 
     425   # echo "######### simuMonitoring_check --> config:$config" 
     426   # former le nom du fichier de suivi de la simu a partir de "config" 
     427   getSimuMonitFileName $config 
     428    
     429   # si le fichier de suivi de simu n'existe pas, il n'y a pas eu de passage de script de liste avant. 
     430   # ==> on sort normalement 
     431   if [ ! -e ${simuMonitoringFile} ] 
     432   then 
     433      return 0 
     434   fi 
     435    
     436   stepMsg=`echo $currentStep | grep -e '^.*\.sh-->OK$' | wc -l ` 
     437   if [ "x{stepMsg}" == "x0" ] 
     438   then 
     439      DEM_errorSend "${PROGNAME}:${LINENO}:Le nom de l'etape courante n'est pas au bon format !" 
     440   fi 
     441    
     442   currentStepScriptName=`echo $currentStep | sed 's;\.sh-->OK;;' ` 
     443    
     444   currentStepPassed=`grep ${currentStep} ${simuMonitoringFile} | wc -l ` 
     445    
     446   # echo "######### simuMonitoring_check --> currentStep:$currentStep" 
     447   # echo "######### simuMonitoring_check --> simuMonitoringFile:$simuMonitoringFile" 
     448   # echo "######### simuMonitoring_check --> currentStepPassed:$currentStepPassed" 
     449   if [ "x${currentStepPassed}" != "x0" ] 
     450   then 
     451      echo "${currentStepScriptName} a deja ete passee ..." 
     452      # echo "-----------------------------------------------------------------------------" 
     453      exit 0 
     454   fi 
     455    
     456} 
     457 
     458function simuMonitoring_OK 
     459{ 
     460   currentStep=${1} 
     461   config=${2} 
     462   # echo "######### simuMonitoring_OK --> config:$config" 
     463   # former le nom du fichier de suivi de la simu a partir de "config" 
     464   getSimuMonitFileName $config 
     465    
     466   echo $currentStep >> $simuMonitoringFile 
     467} 
     468 
     469function getSimuMonitFileName 
     470{ 
     471   # nom du présent prog (pour gestion des erreurs)  
     472   PROGNAME="DEM_utilities.sh" ######### 
     473    
     474   config=${1} 
     475   # echo "######### getSimuMonitFileName --> config:$config" 
     476   configBaseName=$(basename ${config}) 
     477       
     478   # On cherche dans quel sous rep du rep de suivi on va chercher le fichier de suivi de la simu 
     479   listMonitSubDir=`ls -l ${MonitoringDir} | grep -e '^d' | awk '{print $NF}' ` 
     480    
     481   # echo "######### getSimuMonitFileName --> listMonitSubDir:$listMonitSubDir" 
     482    
     483   searchedDir= 
     484   for dir in $listMonitSubDir 
     485   do 
     486       found=`echo $config | grep "/${dir}/" | wc -l ` 
     487       if [ "x${found}" != "x0" ] 
     488       then 
     489          searchedDir=$dir 
     490          break 
     491       fi 
     492   done 
     493    
     494   if [ "x$searchedDir" == "x" ] 
     495   then 
     496      DEM_errorSend "${PROGNAME}:${LINENO}:Sous rep de suivi non trouve !" 
     497   fi 
     498    
     499   # On forme le nom du fichier de suivi pour la simu courante 
     500   # ... on debarasse config du fichier de config 
     501   repConfig=$(dirname $config) 
     502   # ... on supprime du path tout ce qui est devant le nom du sous rep 
     503   simu=`echo $repConfig | sed "s;^.*/$searchedDir;$searchedDir;" ` 
     504   # ... remplacement des "/" par des "_#_" (les "/" ne sont pas acceptes dans les noms de fichiers) 
     505   simuMonitoringFile=`echo $simu | sed 's;/;_#_;g' ` 
     506   # ... On rajoute un ".txt" a la fin du nom de fichier 
     507   simuMonitoringFile="${simuMonitoringFile}.txt" 
     508    
     509   simuMonitoringFile="${MonitoringDir}/${searchedDir}/${simuMonitoringFile}" 
     510} 
     511 
     512# gpdebug : fin ##################################################################################### 
     513 
Note: See TracChangeset for help on using the changeset viewer.