[]
всегда обозначайте дополнительные переключатели, аргументы, опции, и т.д.|
средства или, особенно когда в скобках или круглой скобке.rmdir(2)
перестанет работать, если каталог не будет пуст. Если другой процесс создает файлы в то время как rm(1)
удаляет их, это не будет знать для удаления их и следовательно когда это прибудет время для rm(1)
пытаться удалить, чему это верит, должно быть пустым каталогом, это перестанет работать с ошибкой, которую Вы отправили.
Один способ удалить каталог перед лицом параллельных созданий файла в каталоге состоит в том, чтобы переименовать его:
mv a a~
rm -rf a~
Возможно, что это не может работать если процессы, создающие файлы в a/b
не делают так путем (open(2)
по сравнению с. openat(2)
).
Я предполагаю, что процесс (процессы), который создает файлы в a/b
воссоздаст тот каталог, если он не будет существовать или обработает отказ корректно, если он не существует. Так как Вы уже пытаетесь удалить каталог из-под других процессов, который походит на безопасное предположение.
Существуют другие процессы, которые генерируют файлы к a/b, который связан?
Очень возможно. Это могло бы быть это rm -rf
сначала удаляет все файлы, затем удаляет все каталоги. Под капотом, rmdir
системный вызов удаления каталога перестанет работать, если каталог не будет пуст. У Вас могло бы быть продолжение состояния состязания, где rm -rf
проверки, что каталог пуст, и это; другой процесс затем создает новый файл; наконец rm -rf
вызовы rmdir
, но другой процесс создает файл заранее.
Совет Faheem хорош: поместите ls
в Ваше состояние ошибки
ssh -T user@host <<EOF
cd somewhere
rm -rf a/b || ( ls -a a/b && exit 1 )
EOF
&&
должен быть ;
или иначе ls
отказ будет препятствовать тому, чтобы сценарий вышел.
– R.. GitHub STOP HELPING ICE
07.05.2011, 05:06
ls
шоу, что существуют новые файлы в том dir. Я собираюсь дать mv
решение попытка.
– Cheng
07.05.2011, 16:08
ls
сбои, подоболочка возвратится ls
код неисправности.'&& exit 1
'необходимо для обеспечения этого если ls
успешно выполняется, подоболочка все еще возвращает код ошибки. При замене им '||' Вы замаскируете код истинной погрешности для ls
.
– jmtd
09.05.2011, 16:44
В случае очень высокого состояния гонки :следующая команда удаляет устаревшие файлы, а затем удаляет пустые каталоги:
find /somedir -type f -atime +3 -print0 | xargs -0 --no-run-if-empty rm -f; find /somedir -mindepth 1 -type d -empty -not -name "*.empty" -print0 | xargs -0 --no-run-if-empty -I{} mv {} {}.empty; sleep 30; find /somedir -type d -name '*.empty' -print0 | xargs -0 --no-run-if-empty rm -rf
Или шаг за шагом:
find /somedir -type f -atime +3 -print0 | xargs -0 --no-run-if-empty rm -f;
find /somedir -mindepth 1 -type d -empty -not -name "*.empty" -print0 | xargs -0 --no-run-if-empty -I{} mv {} {}.empty;
sleep 30;
find /somedir -type d -name '*.empty' -print0 | xargs -0 --no-run-if-empty rm -rf;
sleep 30 необходим всем процессам для завершения записи в удаляемый каталог.
ПРЕДУПРЕЖДЕНИЕ :вы можете потерять свои новые данные(в моем случае это кеш, так что мне все равно ).