Właśnie złapałem mylący błąd:
rm: cannot remove `xxx/app/cache/prod': Directory not empty
który został spowodowany przez następujące polecenie:
rm -rf $cache_dir/*
gdzie $cache_dir
jest zdefiniowany jakoxxx/app/cache
Widzę to tak: rm
usunąłem wszystko cache/prod
z cache/prod
katalogu , a następnie tuż przed próbą usunięcia katalogu - inny program utworzył w nim plik / katalog, co spowodowało rm
awarię.
Czy moje założenie jest prawidłowe?
rm -r
nie jest atomowe. Jeśli chcesz mieć pewność, że w trakcie działania katalogu nie zostaną utworzone żadne plikirm -rf
, możesz najpierw zmienić jego nazwę, a następnie usunąć katalog o zmienionej nazwie.rm -rf
bezpieczeństwem wątków: jeśli uruchomisz go wiele razy jednocześnie w tym samym katalogu, katalog zostanie usunięty. Chodzi o to, abyrm -r
nie być atomowym.rm
wywołanie, możemy mówić o bezpieczeństwie wątków. Ale i tak nic to nie zmieniaOdpowiedzi:
Podany komunikat o błędzie brzmiał: „Katalog nie jest pusty” (
ENOTEMPTY
), biorąc pod uwagę, że twoje założenie brzmi poprawnie, że jest to wyścig, w którym program utworzył plik w tym katalogu tuż przedrm
próbą usunięcia katalogu, dając oczekiwanyENOTEMPTY
błąd z bazyrmdir(2)
.UWAGA: Aby zachować bezpieczeństwo, możesz przenieść / zmienić nazwę katalogu na nową nazwę, a następnie wykonać usunięcie tego katalogu.
źródło
mkdir x; cat > x/a &; tail -f x/a &; rm -r x
pokazuje, że katalog można usunąć nawet wtedy, gdy pliki są używane, niezależnie od tego, czy są otwarte do odczytu, czy zapisu.rm
skarży się na błędy uprawnień, więc myślę, że możemy to wyeliminować. Jednak nie jestem wystarczająco pewny siebie, aby opublikować odpowiedź.