Ich habe gerade einen verwirrenden Fehler entdeckt:
rm: cannot remove `xxx/app/cache/prod': Directory not empty
was durch den folgenden Befehl verursacht wurde:
rm -rf $cache_dir/*
wo $cache_dir
ist definiert alsxxx/app/cache
Ich sehe es also so: rm
alles in cache/prod
dir entfernt, dann kurz bevor es versuchte, das cache/prod
Verzeichnis zu entfernen - ein anderes Programm hat eine Datei / ein Verzeichnis darin erstellt, wodurch es einen rm
Fehler verursachte .
Ist meine Annahme richtig?
rm -r
ist nicht atomar. Wenn Sie sicherstellen möchten, dass während derrm -rf
Ausführung keine weiteren Dateien im Verzeichnis erstellt werden , können Sie diese zuerst umbenennen und dann das umbenannte Verzeichnis entfernen.rm -rf
Thread-Sicherheit zu tun : Wenn Sie es mehrmals gleichzeitig im selben Verzeichnis ausführen, wird das Verzeichnis gelöscht. Hier geht es darum,rm -r
nicht atomar zu sein.rm
Aufruf annehmen , können wir über Thread-Sicherheit sprechen. Aber es ändert nichtsAntworten:
Die angegebene Fehlermeldung lautete "Verzeichnis nicht leer" (
ENOTEMPTY
). Angesichts dieser Tatsache klingt Ihre Annahme richtig, dass es sich um eine Race-Bedingung handelt, bei der ein Programm eine Datei in diesem Verzeichnis erstellt hat, bevor esrm
versucht hat, das Verzeichnis zu entfernen, und den erwartetenENOTEMPTY
Fehler aus dem zugrunde liegenden Wert ergibtrmdir(2)
.HINWEIS: Um auf der sicheren Seite zu sein, können Sie das Verzeichnis in einen neuen Namen verschieben / umbenennen und dann das Löschen dieses Verzeichnisses ausführen.
quelle
mkdir x; cat > x/a &; tail -f x/a &; rm -r x
zeigt, dass ein Verzeichnis auch dann entfernt werden kann, wenn Dateien verwendet werden, unabhängig davon, ob sie zum Lesen oder Schreiben geöffnet sind.rm
beschwert sich über Berechtigungsfehler, daher denke ich, dass wir das beseitigen können. Ich bin jedoch nicht sicher genug, um eine Antwort zu schreiben.