Я только что обнаружил непонятную ошибку:
rm: cannot remove `xxx/app/cache/prod': Directory not empty
который был вызван следующей командой:
rm -rf $cache_dir/*
где $cache_dir
определяется какxxx/app/cache
Таким образом, я вижу это так: rm
удалил все в cache/prod
dir, затем прямо перед попыткой удалить cache/prod
каталог - другая программа создала файл / каталог внутри него, что вызвало rm
сбой.
Правильно ли мое предположение?
rm -r
не атомарно. Если вы хотите быть уверены, что файлы не будут созданы в каталоге во времяrm -rf
работы, вы можете сначала переименовать его, а затем удалить переименованный каталог.rm -rf
поточной безопасностью: если вы запускаете его несколько раз одновременно в одном и том же каталоге, каталог удаляется. Этоrm -r
не атомарность.rm
вызова, мы можем говорить о безопасности потока. Но в любом случае, это ничего не меняетОтветы:
Появилось сообщение об ошибке «Каталог не пуст» (
ENOTEMPTY
), учитывая, что ваше предположение звучит правильно, что это состояние гонки, когда программа создала файл в этом каталоге непосредственно передrm
попыткой удалить каталог, выдавая ожидаемуюENOTEMPTY
ошибку из базовогоrmdir(2)
.ПРИМЕЧАНИЕ. Чтобы быть в безопасности, вы можете переместить / переименовать каталог на новое имя, а затем выполнить удаление этого каталога.
источник
mkdir x; cat > x/a &; tail -f x/a &; rm -r x
показывает, что каталог может быть удален, даже когда файлы используются, независимо от того, открыты ли они для чтения или записи.rm
жалуется на ошибки разрешения, поэтому я думаю, что мы можем устранить это. Я не достаточно уверен, чтобы опубликовать ответ, хотя.