source: TOOLS/PACK_IPSL/DEM_utilities.sh @ 1763

Last change on this file since 1763 was 1729, checked in by omamce, 12 years ago

Fonction DEM_write_state : gestion du verrou (.lock) dans le cas ou plusieurs processus veulent ecrire en meme temps.
Fait 10 tentatives espacees de 1 seconde pour ecrire dans le fichier.

Olivier

File size: 3.0 KB
Line 
1#!/bin/bash
2
3#
4# Fonctions utiles pour les scripts de Pack IPSL
5#
6
7function 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
24function 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}
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
71   
72    if [[ ${L_TRY} -ge ${L_MAX_TRY} ]]
73    then
74        DEM_log -0 "Erreur. Verrou sur le fichier : ${L_CONFIG_FILE}"
75        return 1
76    fi
77
78    return 0
79}
80
81function 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
92function 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
103function DEM_log {
104# Affichage d'un message sur stdout et dans un fichier de log
105# DEM_log [-0|-1|-2|-3] Message
106#
107    local MESSAGE P_LINE L_NAME
108    LOG_LEV=${LOG_LEV:-3}
109    local OPTARG OPTIND L_LOG=1
110    local L_DEM_LOG=${DEM_LOG:-dem_log.${$}}
111
112    while getopts 0123 L_NAME
113    do
114        case ${L_NAME} in
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}
133
Note: See TracBrowser for help on using the repository browser.