Bonjour,
Dans un script bash, je renomme un (gros) fichier 'data.dat' avec la commande 'mv',
typiquement cela donne:
mv data.dat data_XXX.dat
ou 'XXX' est un identifiant unique utile pour mon application.
Ainsi, le nom 'data.dat' est a priori libéré dans le système de fichiers
et devrait pouvoir être réutilisé ultérieurement de manière générique,
notamment car ce segment de code tourne en boucle 24h/24 (c'est une acquisition de données).
Seulement voilà, il arrive (très très rarement) que le test de l'existence
du fichier 'data.dat' APRES l'exécution de la commande 'mv'
retourne que le fichier existe toujours!
mv data.dat data_XXX.dat
if [ -f data.dat ]; then
echo "Erreur: le fichier existe toujours!!!"
fi
Pourtant quelques secondes plus tard (plus loin dans le script)
il apparaît que le 'mv' a bel et bien fonctionné correctement.
Après recherche infructeuse d'un éventuel bug dans mon script (qui est en fait
assez complexe car c'est un automate logiciel qui met en oeuvre
de nombreuses ressources/programmes de manière asynchrone),
j'en suis arrivé à formuler la question suivante:
La commande 'mv' est-elle atomique?.. c-à-d, peut-on compter
sur le fait que le boulot est effectivement achevé quand on passe
à la ligne de code suivante ?
et en corrolaire:
... si non est-ce que
le seul moyen de garantir la connaissance de l'état absolu
du filesystem est d'invoquer 'sync' apres 'mv'?
Un grand merci à celles et ceux qui éclaireront ma lanterne
sur ce point.
Pour info:
- j'utilise Linux ubuntu 6.06 (noyau 2.6)
- le disque est en SATA et dispose de suffisamment de capacité
- chaque fichier concerné fait environ 100 Mo,
- le FS est en ext3
- le renommage opère sur une même partition physique.
- le pb arrive entre 1 fois sur 100 et 1 fois sur 1000,
c'est aléatoire et je n'ai pas assez d'historique --
Je n'ai pas pu reproduire le pb dans un script minimal
sur une autre machine.
- il peut arriver qu'au moment du 'mv', la machine soit occupée par
un autre script tournant en parallèle pour compresser un gros fichier
situé sur le même disque.
frc0
--