[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

sync sur un seul fichier



Bonjour,

J'ai de temps en temps un souci dans des scripts bash avec des écritures dans un fichier pas
encore "vues" au moment où je regarde si y'en a eu.

En gros, du 

# stdout dans un rapport (avec préfixe de date)
exec > >(while read line; do echo "[$(date '+%F %T')] $line" >> $RAPPORT; done)

echo "un truc"
…
# si le rapport est non vide on l'envoie
[ -s $RAPPORT ] && mail -s "rapport du $(date +%F)" root < $RAPPORT

Mais le test ci-dessus marche pas toujours, le fichier est parfois vu vide au moment du test
alors qu'il y a bien eu une écriture de lancée (un test [ $(wc -l < $RAPPORT) -gt 0 ] ne fait
pas mieux).
C'est probablement lié à mon exec qui récupère la sortie standard et se fait visiblement en
asynchrone, ou ne met pas à jour les infos en live, je sais pas exactement.

Ajouter un sleep 1 avant de tester règle en général le pb, mais ça me parait pas très propre
ni très fiable (pourquoi 1, pas sûr que ça suffise toujours, etc.).

Un sync avant de tester fonctionnerait probablement, mais c'est trop violent (ça synchronise
tout le filesystem, sur une machine avec un moteur de base de données chargé ça peut figer un
peu trop longtemps les I/O à un mauvais moment).

Une idée pour faire ça correctement ?

Merci

-- 
Daniel


Reply to: