2012-03-02 1 views
2

Je me bats pour comprendre ce qui se passe dans un test que je cours. Test est deux scripts shell s'exécutant sur la même machine.renommer le fichier sur ext3 semble rompre POSIX spec

A:

#!/bin/bash 
    touch target; 
    for ((i=0; i < 1000; i=i+1)); do 
     echo "snafu$i" > $1/file$i; 
     mv -f $1/file$i $1/target; 
    done; 

B:

#!/bin/bash 
    while(true);do 
     cat $1/target; 
    done 

Je courir A/ext3_dir, puis exécutez B/ext3_dir> out (erreurs pour seulement aller à std out).

Tout cela fonctionne très bien et comme prévu selon les spécifications POSIX pour « renommer »:

Si le lien nommé par le nouvel argument existe, il doit être enlevé et ancien rebaptisés à nouveau. Dans ce cas, un lien nommé new doit rester visible aux autres processus tout au long de l'opération de changement de nom et faire référence au fichier référencé par new ou old avant le début de l'opération.

Cependant, si j'ajoute un dur lien vers le fichier temporaire avant de faire le déplacement:

#!/bin/bash 
    touch target; 
    for ((i=0; i < 1000; i=i+1)); do 
     echo "snafu$i" > $1/file$i; 
     ln $1/file$i $1/link$i 
     mv -f $1/file$i $1/target; 
    done; 

Je reçois des erreurs « Aucun fichier ou répertoire » du côté de la lecture - apparemment en contravention avec la POSIX spec.

Quelqu'un peut-il faire la lumière sur ce comportement? Le test est-il valide? Je n'arrive pas à comprendre pourquoi la création d'un lien supplémentaire vers le fichier que je suis en train de déplacer devrait avoir un impact sur la lecture de la destination du déménagement.

+0

aurait dû dire: ceci est sur RHEL5 (2.6.18) –

Répondre

0

Je l'ai exécuté sur Debian, et cela a bien fonctionné sur le système de fichiers EXT3. Je ne vois rien ici qui ne devrait pas fonctionner. J'ai réécrit la boucle pour SH shell, pour le tester avec un script minimal.

#!/bin/sh 
    touch target 
    for i in $(seq 1 999) do 
      echo "snafu$i" > $1/file$i; 
      ln $1/file$i $1/link$i 
      mv -f $1/file$i $1/target 
    done 

Quoi qu'il en soit, que touch target ne devrait pas être touch $1/target?

+0

sur le système de fichiers ext3? –

+0

Oui, sur ext3. C'est un stock Debian en tant qu'invité Virtualbox. J'ai édité la réponse. – karatedog

+0

Juste pour vérifier: vous avez exécuté le deuxième script en lisant le fichier en même temps, non? –