rm -rf не работает при параллельном удалении

rm -rf не удастся, если что-то пытается удалить одно и то же дерево файлов (я думаю, потому что rm перечисляет файлы сначала, а затем удаляет).

Простой тест:

 # Terminal 1 for i in `seq 1 1000`; do mkdir -p /tmp/dirtest/$i; done # Now at the same time in terminal 1 and 2 rm -rf /tmp/dirtest 

Будет некоторый вывод в stderr, например:

 ... rm: cannot remove directory `/tmp/dirtest/294': No such file or directory rm: cannot remove directory `/tmp/dirtest/297': No such file or directory rm: cannot remove directory `/tmp/dirtest/304': No such file or directory 

Я могу игнорировать весь вывод stderr, перенаправляя его на /dev/null , но удаление /tmp/dirtest фактически не срабатывает! После того, как обе команды закончены, /tmp/dirtest все еще есть.

Как я могу заставить rm правильно удалить дерево каталогов и действительно игнорировать все ошибки?

2 Solutions collect form web for “rm -rf не работает при параллельном удалении”

Насти. Но в некотором смысле вы ищете проблемы, когда два параллельных процесса управляют деревом каталогов. Unix предоставляет примитивы для атомной манипуляции с одним файлом, но не для целых деревьев каталогов.

Простым обходным решением будет ваш сценарий для переименования каталога перед его удалением. Поскольку у вашего варианта использования есть взаимодействующие скрипты, это нормально, чтобы новое имя было предсказуемым.

 mv /build/tree /build/tree.rm.$$ mkdir /build/tree rm -rf /build/tree.rm.$$ 

Возможно, вы даже можете сделать rm в фоновом режиме позже, в то время как ваша сборка выполняет некоторые задачи, связанные с процессором.

Мне любопытно, как система сборки закончилась так. Можете ли вы его изменить? Как минимум, вы можете создать флаг, который позволяет скриптам знать, что другой уже выполняет эту работу …

 mkdir /tmp/flag.rmdirtest && rm -rf /tmp/dirtest && rmdir /tmp/flag.rmdirtest 

Было бы лучше перепроектировать вещь, чтобы это не было необходимо.

  • Удалите все файлы отмены Vim во всех, кроме одного каталога
  • Не удается удалить файл - разрешено разрешение - почему?
  • Как удалить все файлы из wtihin определенного каталога, кроме дочернего каталога этого каталога?
  • Как удалить файлы, символические в одной папке, но оставить свои подкаталоги без изменений?
  • Удалено / tmp случайно
  • Почему моя команда 'rm' отлично работает в терминале на моем Mac, а не из сценария оболочки?
  • Удалить каталог в ftp
  • Непоследовательность в поведении «rm» при подключенном томе?
  • «Rm. *» Когда-либо удаляет родительский каталог?
  • rm -rf: невозможно удалить `/ opt / jetty ': каталог не пуст
  • удалять старые файлы журналов, кроме последнего (с буквенно-цифровой сортировкой)
  • Interesting Posts

    Как перестроить /etc/cron.d на CentOS?

    Как запустить команду для каждого номера в диапазоне

    Как сделать ручку изменения часового пояса Ubuntu?

    ssh: Использовать случаи отпечатков пальцев и randomart

    Firefox не хочет выполнять

    Удалить полную строку в текстовых файлах на основе тегов

    Как просмотреть эффективные серверы dns?

    Служебные стартовые сообщения службы повторного запуска повторяются второй раз

    Подождите, пока не будет входящего сетевого соединения в течение N минут, затем выполните команду

    Делайте работу «читать», когда не фокусируетесь на терминале

    Нужны хорошие идеи об улучшении любого сервиса Linux

    Получение статистики ввода-вывода дисков для одиночного процесса в Linux

    Почему этот apt-get remove имеет такие глубокие последствия?

    java.net.BindException: адрес уже используется при запуске puppetdb и jira

    Не удается запустить startx на Debian после некоторых изменений

    Linux и Unix - лучшая ОС в мире.