Open mallek-ahmed opened 1 year ago
main () {
steps=($1)
for step in "${steps[@]}"; do $step exit_code=$? if [ $exit_code -ne 0 ]; then echo "Erreur lors de l'exécution de l'étape $step" return $exit_code fi done return 0 }
main () {
steps=($1)
for step in "${steps[@]}"; do $step exit_code=$? case $exit_code in 0) ;; # Pas d'erreur, on continue 2|4) # Warning, on continue echo "Warning lors de l'exécution de l'étape $step" ;; 1|3|5) # Erreur, on arrête echo "Erreur lors de l'exécution de l'étape $step" return $exit_code ;; *) # Tout autre code de sortie est considéré comme une erreur echo "Erreur inattendue lors de l'exécution de l'étape $step" return $exit_code ;; esac done return 0 }
S001() {
return $? }
S002() {
return $? }
S003() {
return $? }
S004() {
return $? }
main() {
steps=($1)
for step in "${steps[@]}"; do $step exit_code=$? case $exit_code in 0) ;; # Pas d'erreur, on continue 2|4) # Warning, on continue echo "Warning lors de l'exécution de l'étape $step" ;; 1|3|5) # Erreur, on arrête echo "Erreur lors de l'exécution de l'étape $step" return $exit_code ;; *) # Tout autre code de sortie est considéré comme une erreur echo "Erreur inattendue lors de l'exécution de l'étape $step" return $exit_code ;; esac done return 0 }
main "S001 S002 S004"
S001() {
return $? }
S002() {
return $? }
S003() {
return $? }
S004() {
return $? }
STEP_BEGIN="S001" STEP_END="S004"
main() {
steps=($1)
execute=false
for step in "${steps[@]}"; do if [[ $step == $STEP_BEGIN ]]; then execute=true fi if $execute; then $step exit_code=$? case $exit_code in 0) ;; # Pas d'erreur, on continue 2|4) # Warning, on continue echo "Warning lors de l'exécution de l'étape $step" ;; 1|3|5) # Erreur, on arrête echo "Erreur lors de l'exécution de l'étape $step" return $exit_code ;; *) # Tout autre code de sortie est considéré comme une erreur echo "Erreur inattendue lors de l'exécution de l'étape $step" return $exit_code ;; esac fi if [[ $step == $STEP_END ]]; then break fi done return 0 }
main "S001 S002 S003 S004"
Proposition pour les paramètres
S001() {
return $? }
S002() {
return $? }
S003() {
return $? }
S004() {
return $? }
STEP_BEGIN="S001" STEP_END="S004"
main() {
steps=($1)
execute=false
for step in "${steps[@]}"; do if [[ $step == $STEP_BEGIN ]]; then execute=true fi if $execute; then $step $2 $3 $4 $5 # Passer les arguments aux fonctions exit_code=$? case $exit_code in 0) ;; # Pas d'erreur, on continue 2|4) # Warning, on continue echo "Warning lors de l'exécution de l'étape $step" ;; 1|3|5) # Erreur, on arrête echo "Erreur lors de l'exécution de l'étape $step" return $exit_code ;; *) # Tout autre code de sortie est considéré comme une erreur echo "Erreur inattendue lors de l'exécution de l'étape $step" return $exit_code ;; esac fi if [[ $step == $STEP_END ]]; then break fi done return 0 }
main "S001 S002 S003 S004" $@
S001() {
return $? }
S002() {
return $? }
S003() {
return $? }
S004() {
return $? }
S009() {
return $? }
STEP_BEGIN=${1:-"S001"} STEP_END=${2:-"S009"}
ALL_STEPS=("S001" "S002" "S003" "S004" "S005" "S006" "S007" "S008" "S009")
main() {
execute=false
for step in "${ALL_STEPS[@]}"; do if [[ $step == $STEP_BEGIN ]]; then execute=true fi if $execute; then $step exit_code=$? case $exit_code in 0) ;; # Pas d'erreur, on continue 2|4) # Warning, on continue echo "Warning lors de l'exécution de l'étape $step" ;; 1|3|5) # Erreur, on arrête echo "Erreur lors de l'exécution de l'étape $step" return $exit_code ;; *) # Tout autre code de sortie est considéré comme une erreur echo "Erreur inattendue lors de l'exécution de l'étape $step" return $exit_code ;; esac fi if [[ $step == $STEP_END ]]; then break fi done return 0 }
main
STATE_FILE="state_file.txt"
declare -A GLOBAL_VARS
S001() {
GLOBAL_VARS["VAR1"]="new_value1" return $? }
S002() {
GLOBAL_VARS["VAR2"]="new_value2" return $? }
S009() {
return $? }
load_state() { if [ -f "$STATE_FILE" ]; then while IFS='=' read -r key value; do if [ "$key" == "LAST_STEP" ]; then LAST_STEP=$value else GLOBAL_VARS["$key"]=$value fi done < "$STATE_FILE" fi }
save_state() {
"$STATE_FILE" for key in "${!GLOBAL_VARS[@]}"; do echo "$key=${GLOBAL_VARS[$key]}" >> "$STATE_FILE" done echo "LAST_STEP=$1" >> "$STATE_FILE" }
main() {
ALL_STEPS=("S001" "S002" "S003" "S004" "S005" "S006" "S007" "S008" "S009")
load_state
start=false
if [ -z "$LAST_STEP" ]; then start=true fi
for step in "${ALL_STEPS[@]}"; do if [ "$step" == "$LAST_STEP" ]; then start=true fi if $start; then $step exit_code=$? case $exit_code in 0) ;; # Pas d'erreur, on continue 2|4) # Warning, on continue echo "Warning lors de l'exécution de l'étape $step" ;; 1|3|5) # Erreur, on arrête echo "Erreur lors de l'exécution de l'étape $step"
save_state $step
exit $exit_code
;;
*) # Tout autre code de sortie est considéré comme une erreur
echo "Erreur inattendue lors de l'exécution de l'étape $step"
# Sauvegarder l'état avant de sortir
save_state $step
exit $exit_code
;;
esac
# Sauvegarder l'état après chaque step réussi
save_state
fi
done }
main
STATE_FILE="state_file.txt"
declare -A GLOBAL_VARS
S000() {
return $? }
S001() {
GLOBAL_VARS["VAR1"]="new_value1" return $? }
S002() {
GLOBAL_VARS["VAR2"]="new_value2" return $? }
S009() {
return $? }
load_state() { if [ -f "$STATE_FILE" ]; then while IFS='=' read -r key value; do if [ "$key" == "LAST_STEP" ]; then LAST_STEP=$value else GLOBAL_VARS["$key"]=$value fi done < "$STATE_FILE" fi }
save_state() {
"$STATE_FILE" for key in "${!GLOBAL_VARS[@]}"; do echo "$key=${GLOBAL_VARS[$key]}" >> "$STATE_FILE" done echo "LAST_STEP=$1" >> "$STATE_FILE" }
main() {
ALL_STEPS=("S001" "S002" "S003" "S004" "S005" "S006" "S007" "S008" "S009")
load_state
start=false
if [ -z "$LAST_STEP" ]; then start=true fi
S000 exit_code=$? if [ $exit_code -ne 0 ]; then echo "Erreur lors de l'exécution de l'étape S000" exit $exit_code fi
for step in "${ALL_STEPS[@]}"; do if [ "$step" == "$LAST_STEP" ]; then start=true fi if $start; then $step exit_code=$? case $exit_code in 0) ;; # Pas d'erreur, on continue 2|4) # Warning, on continue echo "Warning lors de l'exécution de l'étape $step" ;; 1|3|5) # Erreur, on arrête echo "Erreur lors de l'exécution de l'étape $step"
save_state $step
exit $exit_code
;;
*) # Tout autre code de sortie est considéré comme une erreur
echo "Erreur inattendue lors de l'exécution de l'étape $step"
# Sauvegarder l'état avant de sortir
save_state $step
exit $exit_code
;;
esac
# Sauvegarder l'état après chaque step réussi
save_state $step
fi
done }
main
STATE_FILE="state_file.txt"
declare -A GLOBAL_VARS
S000() {
return $? }
S001() {
GLOBAL_VARS["VAR1"]="new_value1" return $? }
S002() {
GLOBAL_VARS["VAR2"]="new_value2" return $? }
S009() {
return $? }
load_state() { if [ -f "$STATE_FILE" ]; then while IFS='=' read -r key value; do if [ "$key" == "LAST_STEP" ]; then LAST_STEP=$value else GLOBAL_VARS["$key"]=$value fi done < "$STATE_FILE" fi }
save_state() {
"$STATE_FILE" for key in "${!GLOBAL_VARS[@]}"; do echo "$key=${GLOBAL_VARS[$key]}" >> "$STATE_FILE" done echo "LAST_STEP=$1" >> "$STATE_FILE" }
main() {
ALL_STEPS=("S001" "S002" "S003" "S004" "S005" "S006" "S007" "S008" "S009")
load_state
start=false
if [ -z "$LAST_STEP" ]; then start=true fi
S000 exit_code=$? if [ $exit_code -ne 0 ]; then echo "Erreur lors de l'exécution de l'étape S000" exit $exit_code fi
for step in "${ALL_STEPS[@]}"; do if [ "$step" == "$LAST_STEP" ]; then start=true fi if $start; then $step exit_code=$? case $exit_code in 0) ;; # Pas d'erreur, on continue 2|4) # Warning, on continue echo "Warning lors de l'exécution de l'étape $step" ;; 1|3|5) # Erreur, on arrête echo "Erreur lors de l'exécution de l'étape $step"
save_state $step
exit $exit_code
;;
*) # Tout autre code de sortie est considéré comme une erreur
echo "Erreur inattendue lors de l'exécution de l'étape $step"
# Sauvegarder l'état avant de sortir
save_state $step
exit $exit_code
;;
esac
# Sauvegarder l'état après chaque step réussi
save_state $step
fi
done
rm -f "$STATE_FILE" return 0 }
main
STATE_FILE="state_file.txt"
declare -A GLOBAL_VARS
S000() {
return $? }
S001() {
GLOBAL_VARS["VAR1"]="new_value1" return $? }
S002() {
GLOBAL_VARS["VAR2"]="new_value2" return $? }
S009() {
return $? }
load_state() { if [ -f "$STATE_FILE" ]; then while IFS='=' read -r key value; do if [ "$key" == "LAST_STEP" ]; then LAST_STEP=$value else GLOBAL_VARS["$key"]=$value fi done < "$STATE_FILE" fi }
save_state() {
"$STATE_FILE" for key in "${!GLOBAL_VARS[@]}"; do echo "$key=${GLOBAL_VARS[$key]}" >> "$STATE_FILE" done echo "LAST_STEP=$1" >> "$STATE_FILE" }
main() {
ALL_STEPS=("S001" "S002" "S003" "S004" "S005" "S006" "S007" "S008" "S009")
load_state
start=false
if [ -z "$LAST_STEP" ]; then start=true fi
S000 exit_code=$? if [ $exit_code -ne 0 ]; then echo "Erreur lors de l'exécution de l'étape S000" exit $exit_code fi
for step in "${ALL_STEPS[@]}"; do if [ "$step" == "$LAST_STEP" ]; then start=true fi if $start; then
echo "Début de l'étape $step à $(date)"
start_time=$(date +%s)
$step
exit_code=$?
# Ajouter la date de fin d'exécution et la durée
end_time=$(date +%s)
echo "Fin de l'étape $step à $(date)"
echo "Durée de l'étape $step : $(($end_time - $start_time)) secondes"
case $exit_code in
0) ;; # Pas d'erreur, on continue
2|4) # Warning, on continue
echo "Warning lors de l'exécution de l'étape $step"
;;
1|3|5) # Erreur, on arrête
echo "Erreur lors de l'exécution de l'étape $step"
exit $exit_code
;;
*) # Autre code de retour, on arrête
echo "Erreur inconnue lors de l'exécution de l'étape $step"
exit $exit_code
;;
esac
# Sauvegarder l'état après chaque step réussi
save_state $step
fi
done
rm -f "$STATE_FILE" }
main
Documentation du Script Shell
Il conserve également l'état d'exécution dans un fichier, ce qui permet de reprendre l'exécution là où elle s'est arrêtée en cas d'erreur. Le script enregistre également des informations détaillées sur le déroulement de chaque étape, y compris la date et l'heure de début et de fin, ainsi que la durée.
Une fonction S000 est également présente. Celle-ci est exécutée avant chaque étape pour charger les fonctions communes et les variables d'environnement. Elle doit être définie selon les besoins de votre application.
2.2. Utiliser des variables globales Les variables globales sont stockées dans un tableau associatif nommé GLOBAL_VARS. Si une étape a besoin de définir une variable globale, elle doit l'ajouter à ce tableau. Par exemple, GLOBAL_VARS["VAR1"]="new_value1". Les variables globales sont automatiquement sauvegardées et restaurées à partir du fichier d'état.
2.3. Gérer les erreurs Si une étape échoue (c'est-à-dire retourne 1, 3 ou 5), le script s'arrête et enregistre l'état actuel dans le fichier d'état. Lors de la prochaine exécution, il reprendra à partir de l'étape qui a échoué.
Si une étape retourne un avertissement (2 ou 4), le script continue à exécuter les étapes suivantes mais affiche un message d'avertissement.
2.4. Suivre l'exécution Le script enregistre des informations détaillées sur l'exécution de chaque étape, y compris la date et l'heure de début et de fin, ainsi que la durée. Ces informations sont affichées à la console.
Ensuite, exécutez le script avec la commande ./mon_script.ksh. Le script commencera à exécuter les étapes en séquence.
Si une erreur se produit, corrigez le problème, puis relancez le script avec la même commande. Le script reprendra à partir de l'étape qui a échoué.
Pour effacer l'état et recommencer depuis le début, supprimez le fichier d'état avec la commande rm state.txt.
!/bin/ksh
Définition des fonctions
S001 () { echo "Exécution de S001..."
Vos instructions ici...
return 0 # retourner 0 si tout s'est bien passé, autrement retourner une autre valeur }
S002 () { echo "Exécution de S002..."
Vos instructions ici...
return 0 # retourner 0 si tout s'est bien passé, autrement retourner une autre valeur }
S003 () { echo "Exécution de S003..."
Vos instructions ici...
return 0 # retourner 0 si tout s'est bien passé, autrement retourner une autre valeur }
S004 () { echo "Exécution de S004..."
Vos instructions ici...
return 0 # retourner 0 si tout s'est bien passé, autrement retourner une autre valeur }
main () {
Transformer la chaîne d'entrée en tableau
steps=($1)
Exécuter chaque step
for step in "${steps[@]}"; do $step if [ $? -ne 0 ]; then echo "Erreur lors de l'exécution de l'étape $step" return 1 fi done return 0 }
Appel principal de prog_main
prog_main () { main "$1" if [ $? -ne 0 ]; then echo "Erreur lors de l'exécution de prog_main" exit 1 fi }
Appel de prog_main avec la liste des steps à exécuter
prog_main "S001 S002 S004"