# Fonction pour ajouter une ligne à un fichier avec verrouillage (bloquant + timeout + gestion des signaux) append_with_lock() { local line="$2" local file="$3" local lock_dir="${file::-4}.lock" local timeout=30 # Timeout en secondes (ajustable) local start_time=$(date +%s) local got_lock=false # Fonction de nettoyage du verrou (appelée en cas de signal ou de sortie) cleanup_lock() { if [ -d "$lock_dir" ]; then rmdir "$lock_dir" 2>/dev/null || : fi } # Piège les signaux d'interruption pour libérer le verrou trap cleanup_lock INT TERM EXIT # Attendre le verrou avec timeout while true; do # Vérifier le timeout local current_time=$(date +%s) if [ $((current_time - start_time)) -ge $timeout ]; then echo "Timeout atteint pour l'obtention du verrou sur $file" >&2 trap - INT TERM EXIT # Désactive le piège pour éviter un nettoyage double return 1 fi # Tentative de verrouillage if mkdir "$lock_dir" 2>/dev/null; then got_lock=true break else sleep 0.1 # Attendre avant de réessayer fi done # Écriture dans le fichier (si verrou obtenu) if $got_lock; then echo "$line" >> "$file" echo "$line" >> "$file" # write them twice because of bug where a line is skipped # Libérer le verrou rmdir "$lock_dir" || : trap - INT TERM EXIT # Désactive le piège après utilisation fi } export -f append_with_lock