Какова причина, что “комната-rf a/b,” говорит “a/b, не пуста”?

  1. Раздел резюме обычно дает некоторые примеры использования в качестве примера. Иногда подкоманды имеют различные варианты, таким образом, несколько примеров можно было бы показать.
  2. Скобки [] всегда обозначайте дополнительные переключатели, аргументы, опции, и т.д.
  3. Да, канал | средства или, особенно когда в скобках или круглой скобке.
  4. Скобки в скобках просто означают, что вторая часть зависит от первого, и также оно дополнительный. Некоторые переключатели можно использовать самостоятельно или добавить значение к ним. Запятые в начале скобки указали бы, что могут быть несколько, запятая разделила значения.
  5. Они основываются на понятиях Regex, но предназначены для человека, так не следуйте всем правилам выхода и т.д.
7
04.05.2011, 19:00
3 ответа

rmdir(2) перестанет работать, если каталог не будет пуст. Если другой процесс создает файлы в то время как rm(1) удаляет их, это не будет знать для удаления их и следовательно когда это прибудет время для rm(1) пытаться удалить, чему это верит, должно быть пустым каталогом, это перестанет работать с ошибкой, которую Вы отправили.

Один способ удалить каталог перед лицом параллельных созданий файла в каталоге состоит в том, чтобы переименовать его:

mv a a~
rm -rf a~

Возможно, что это не может работать если процессы, создающие файлы в a/b не делают так путем (open(2) по сравнению с. openat(2)).

Я предполагаю, что процесс (процессы), который создает файлы в a/b воссоздаст тот каталог, если он не будет существовать или обработает отказ корректно, если он не существует. Так как Вы уже пытаетесь удалить каталог из-под других процессов, который походит на безопасное предположение.

7
27.01.2020, 20:14

Существуют другие процессы, которые генерируют файлы к 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
15
27.01.2020, 20:14
  • 1
    Очень интересный. –  boehj 05.05.2011, 07:01
  • 2
    && должен быть ; или иначе ls отказ будет препятствовать тому, чтобы сценарий вышел. –  R.. GitHub STOP HELPING ICE 07.05.2011, 05:06
  • 3
    Да. ls шоу, что существуют новые файлы в том dir. Я собираюсь дать mv решение попытка. –  Cheng 07.05.2011, 16:08
  • 4
    @R, который не верен. Если 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 необходим всем процессам для завершения записи в удаляемый каталог.

ПРЕДУПРЕЖДЕНИЕ :вы можете потерять свои новые данные(в моем случае это кеш, так что мне все равно ).

0
27.01.2020, 20:14

Теги

Похожие вопросы