[1709] | 1 | #!/bin/bash |
---|
| 2 | |
---|
| 3 | # |
---|
| 4 | # Fonctions utiles pour les scripts de Pack IPSL |
---|
| 5 | # |
---|
| 6 | |
---|
| 7 | function DEM_read_state { |
---|
| 8 | # Lire l'état du pack pour une simulation |
---|
| 9 | local L_CONFIG_FILE=${1} |
---|
| 10 | local L_CONFIG_CARD=${2} |
---|
| 11 | |
---|
| 12 | local L_OLD_STATE=$( grep ${L_CONFIG_CARD} ${L_CONFIG_FILE} | awk '{print $2}' ) |
---|
| 13 | |
---|
| 14 | if [ ${?} -eq 0 ] |
---|
| 15 | then |
---|
| 16 | echo ${L_OLD_STATE} |
---|
| 17 | return 0 |
---|
| 18 | else |
---|
| 19 | return 1 |
---|
| 20 | fi |
---|
| 21 | return 0 |
---|
| 22 | } |
---|
| 23 | |
---|
| 24 | function DEM_write_state { |
---|
| 25 | # Mettre à jour l'état du pack pour une simulation |
---|
| 26 | local L_CONFIG_FILE=${1} |
---|
| 27 | local L_CONFIG_CARD=${2} |
---|
| 28 | local L_NEW_STATE=${3} |
---|
[1729] | 29 | |
---|
| 30 | local L_MAX_TRY=10 L_TRY=0 L_CHECK L_PP |
---|
| 31 | |
---|
| 32 | # On essaye ${L_MAX_TRY} fois de mettre à jour le fichier |
---|
| 33 | while [ ${L_TRY} -le ${L_MAX_TRY} ] |
---|
| 34 | do |
---|
| 35 | if [[ ! -f ${L_CONFIG_FILE}.lock ]] |
---|
| 36 | then |
---|
| 37 | echo ${$} >> ${L_CONFIG_FILE}.lock ; chmod -w ${L_CONFIG_FILE}.lock |
---|
| 38 | L_CHECK=$( wc -l ${L_CONFIG_FILE}.lock | awk '{print $1}' ) |
---|
| 39 | if [[ ${L_CHECK} -gt 1 ]] |
---|
| 40 | then |
---|
| 41 | DEM_log -0 "Erreur. Plusieurs processus on pose un verrou sur ${L_CONFIG_FILE}" |
---|
| 42 | for L_PP in $( awk '{print $1}' ${L_CONFIG_FILE}.lock ) |
---|
| 43 | do |
---|
| 44 | DEM_log -0 "Erreur. Process : ${L_PP}" |
---|
| 45 | done |
---|
| 46 | return 1 |
---|
| 47 | fi |
---|
| 48 | |
---|
| 49 | local L_OLD_LINE=$( grep ${L_CONFIG_CARD} ${L_CONFIG_FILE} ) |
---|
| 50 | [[ ${?} -eq 0 ]] || ( return 1 ; ) |
---|
| 51 | if [[ ${L_OLD_LINE} = "" ]] |
---|
| 52 | then |
---|
| 53 | DEM_log -0 "Erreur. Dans le fichier : ${L_CONFIG_FILE}, Experience ${L_CONFIG_CARD} non trouvee" |
---|
| 54 | return 1 |
---|
| 55 | fi |
---|
| 56 | local L_OLD_STATE=$( echo ${L_OLD_LINE} | awk '{print $2}' ) |
---|
| 57 | [[ ${?} -eq 0 ]] || ( return 1 ; ) |
---|
| 58 | |
---|
| 59 | L_NEW_LINE="${L_CONFIG_CARD} ${L_NEW_STATE}" |
---|
| 60 | |
---|
| 61 | sed -i "s%${L_OLD_LINE}%${L_NEW_LINE}%" ${L_CONFIG_FILE} |
---|
| 62 | rm -f ${L_CONFIG_FILE}.lock |
---|
| 63 | break |
---|
| 64 | else |
---|
| 65 | (( L_TRY = L_TRY + 1 )) |
---|
| 66 | DEM_log -3 "Fichier ${L_CONFIG_FILE} en cours de modif par un autre processus. Essai ${L_TRY}" |
---|
| 67 | sleep 1 |
---|
| 68 | fi |
---|
| 69 | |
---|
| 70 | done |
---|
[1709] | 71 | |
---|
[1729] | 72 | if [[ ${L_TRY} -ge ${L_MAX_TRY} ]] |
---|
[1709] | 73 | then |
---|
| 74 | DEM_log -0 "Erreur. Verrou sur le fichier : ${L_CONFIG_FILE}" |
---|
| 75 | return 1 |
---|
| 76 | fi |
---|
[1729] | 77 | |
---|
[1709] | 78 | return 0 |
---|
| 79 | } |
---|
| 80 | |
---|
| 81 | function DEM_min { |
---|
| 82 | # Calcul du minimum d'un nombre quelconque d'entiers |
---|
| 83 | local l_min=${1} l_xx |
---|
| 84 | |
---|
| 85 | for l_xx in ${*:2:${#}} |
---|
| 86 | do |
---|
| 87 | [[ ${l_xx} -lt ${l_min} ]] && l_min=${l_xx} |
---|
| 88 | done |
---|
| 89 | echo ${l_min} |
---|
| 90 | } |
---|
| 91 | |
---|
| 92 | function DEM_max { |
---|
| 93 | # Calcul du maximum d'un nombre quelconque d'entiers |
---|
| 94 | local l_max=${1} l_xx |
---|
| 95 | |
---|
| 96 | for l_xx in ${*:2:${#}} |
---|
| 97 | do |
---|
| 98 | [[ ${l_xx} -gt ${l_max} ]] && l_max=${l_xx} |
---|
| 99 | done |
---|
| 100 | echo ${l_max} |
---|
| 101 | } |
---|
| 102 | |
---|
| 103 | function DEM_log { |
---|
| 104 | # Affichage d'un message sur stdout et dans un fichier de log |
---|
| 105 | # DEM_log [-0|-1|-2|-3] Message |
---|
| 106 | # |
---|
[1729] | 107 | local MESSAGE P_LINE L_NAME |
---|
[1709] | 108 | LOG_LEV=${LOG_LEV:-3} |
---|
| 109 | local OPTARG OPTIND L_LOG=1 |
---|
| 110 | local L_DEM_LOG=${DEM_LOG:-dem_log.${$}} |
---|
| 111 | |
---|
[1729] | 112 | while getopts 0123 L_NAME |
---|
[1709] | 113 | do |
---|
[1729] | 114 | case ${L_NAME} in |
---|
[1709] | 115 | ( 0 ) L_LOG=1 ;; |
---|
| 116 | ( 1 ) L_LOG=1 ;; |
---|
| 117 | ( 2 ) L_LOG=2 ;; |
---|
| 118 | ( 3 ) L_LOG=3 ;; |
---|
| 119 | esac |
---|
| 120 | done |
---|
| 121 | shift $(( ${OPTIND} - 1 )) |
---|
| 122 | |
---|
| 123 | if [[ ${L_LOG} -le ${LOG_LEV} ]] |
---|
| 124 | then |
---|
| 125 | MESSAGE=${*} |
---|
| 126 | P_LINE="$(date) - ${MESSAGE}" |
---|
| 127 | |
---|
| 128 | echo ${P_LINE} |
---|
| 129 | echo ${P_LINE} >> ${L_DEM_LOG} |
---|
| 130 | fi |
---|
| 131 | return |
---|
| 132 | } |
---|
[1729] | 133 | |
---|