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

Répondre à