# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 function __lf_get_age() { y=$(date "+%Y") dy=$(date "+%j"); while [ ${dy#0} != $dy ]; do dy=${dy#0}; done h=$(date "+%H"); while [ ${h#0} != $h ]; do h=${h#0}; done echo $((($y * 365 + $dy) * 24 + $h)) } function lockfile_set() { # USAGE # lockfile_set [-h max_hours] /path/to/lockfile # OPTIONS # lockfile # fichier qui doit contenir le verrou # -h max_hours # Nombre d'heures (par défaut 4) au bout duquel on retourne 2 # Sinon, on retourne 1. # Retourne 0 si le verrou a été placé correctement. Le fichier sera supprimé # automatiquement en fin de script. # Retourne 1 si le verrou n'a pas pu être placé # Retourne 2 si le verrou n'a pas pu être placé au bout de max_hours heures local OENC="$UTF8" local end_of_options lockfile max_hours=4 while [ -n "$1" ]; do case "$1" in -h) shift max_hours="$1" ;; --) shift end_of_options=1 ;; -*) if ! set_verbosity "$1" -v; then ewarn "option non reconnue: $1" fi ;; *) end_of_options=1 ;; esac [ -n "$end_of_options" ] && break shift done lockfile="$1" [ -n "$lockfile" ] || return 1 local now="$(__lf_get_age)" if [ -f "$lockfile" ]; then local prev=$(<"$lockfile") diff="$(($now - $prev))" [ "$diff" -gt "$max_hours" ] && return 2 || return 1 fi touch "$lockfile" || return 1 autoclean "$lockfile" echo "$now" >"$lockfile" } function pidfile_set() { # USAGE # pidfile_set [-p pid] /path/to/pidfile # OPTIONS # pidfile # fichier qui doit contenir le pid du script # -p pid # spécifier le pid. par défaut, utiliser $$ # -r # si pidfile existe mais que le processus ne tourne plus, faire # comme si le fichier n'existe pas. # Retourner 0 si le pid a été correctement écrit dans le fichier. Ce fichier # sera supprimmé automatiquement en fin de script # Retourner 1 si le fichier existe déjà et que le processus est en train de # tourner. # Retourner 2 si le fichier existe déjà mais que le processus ne tourne # plus. # Retourner 10 si autre erreur grave s'est produite (par exemple, s'il manque # le chemin vers pidfile, ou si le fichier n'est pas accessible en # écriture.) local OENC="$UTF8" local end_of_options pidfile pid=$$ replace= while [ -n "$1" ]; do case "$1" in -p) shift pid="$1" ;; -r) replace=1 ;; --) shift end_of_options=1 ;; -*) if ! set_verbosity "$1" -v; then ewarn "option non reconnue: $1" fi ;; *) end_of_options=1 ;; esac [ -n "$end_of_options" ] && break shift done pidfile="$1" [ -n "$pidfile" ] || return 10 if [ -f "$pidfile" ]; then local curpid="$(<"$pidfile")" if is_running "$curpid"; then return 1 elif [ -n "$replace" ]; then /bin/rm -f "$pidfile" || return 10 else return 2 fi fi echo_ "$pid" >"$pidfile" || return 10 autoclean "$pidfile" return 0 } function read_mainClasses() { # USAGE # read_mainClasses scriptName /path/to/mainClasses # Lire le fichier mainClasses et initialiser les variables correspondant à # scriptName. # Retourner 1 si une erreur quelconque se produit: l'entrée correspondant à # scriptName n'a pas été trouvée, il manque des arguments, ou le fichier # mainClasses n'existe pas. # Les lignes dans le fichier mainClasses doivent être de la forme # scriptName:mainClass[;var0=value0;...] local OENC="$UTF8" local scriptname_="$1" mainClasses_="$2" [ -n "$scriptname_" -a -n "$mainClasses_" ] || return 1 local line_="$(grep "^$scriptname_:" "$mainClasses_")" || return 1 [ -n "$line_" ] || return 1 #scriptname="${line_%%:*}" line_="${line_#*:}" mainClass="${line_%%;*}" line_="${line_#*;}" if [ "$line_" != "$mainClass" ]; then # Evaluer les variables eval "$line_" fi }