51 lines
1.6 KiB
Bash
51 lines
1.6 KiB
Bash
# Fonction pour ajouter une ligne à un fichier avec verrouillage (bloquant + timeout + gestion des signaux)
|
|
append_with_lock() {
|
|
local line="$1"
|
|
local file="$2"
|
|
local lock_dir="/tmp/dancevideos_moved_files.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
|
|
set -x
|
|
echo "$line" >> "$file"
|
|
echo "$line" >> "$file" # write them twice because of bug where a line is skipped
|
|
set +x
|
|
# 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
|