Je viens de découvrir une erreur déroutante:
rm: cannot remove `xxx/app/cache/prod': Directory not empty
qui a été provoquée par la commande suivante:
rm -rf $cache_dir/*
où $cache_dir
est défini commexxx/app/cache
Je le vois donc comme: rm
tout supprimé dans cache/prod
dir, puis juste avant de tenter de supprimer le cache/prod
répertoire - un autre programme a créé un fichier / répertoire à l'intérieur, ce qui a provoqué un rm
échec.
Mon hypothèse est-elle correcte?
rm -r
n'est pas atomique. Si vous voulez être sûr qu'aucun autre fichier n'est créé dans le répertoire pendant qu'ilrm -rf
est en cours d'exécution, vous pouvez le renommer en premier, puis supprimer le répertoire renommé.rm -rf
sécurité des threads: si vous l'exécutez plusieurs fois simultanément sur le même répertoire, le répertoire est supprimé. Il s'agit derm -r
ne pas être atomique.rm
invocation, nous pouvons parler de thread-safety. Mais de toute façon, cela ne change rienRéponses:
Le message d'erreur donné était "Répertoire non vide" (
ENOTEMPTY
), étant donné que votre hypothèse semble correcte, qu'il s'agit d'une condition de concurrence critique où un programme a créé un fichier dans ce répertoire juste avant d'rm
essayer de supprimer le répertoire, donnant l'ENOTEMPTY
erreur attendue du sous-jacentrmdir(2)
.REMARQUE: pour être sûr, vous pouvez déplacer / renommer le répertoire sous un nouveau nom, puis exécuter la suppression de ce répertoire.
la source
mkdir x; cat > x/a &; tail -f x/a &; rm -r x
montre qu'un répertoire peut être supprimé même lorsque des fichiers sont en cours d'utilisation, qu'ils soient ouverts en lecture ou en écriture.rm
se plaint d'erreurs d'autorisation, donc je pense que nous pouvons éliminer cela. Je ne suis pas assez confiant pour poster une réponse cependant.