Ожидайте каталога перемещения, который будет завершен прежде, чем попытаться удалить его

Лучшее решение состояло бы в том, чтобы создать Ваш пакет с корректными зависимостями. Как быстрый взлом можно отметить пакет, как вручную установлено, это предотвратит autoremove от удаления его.

apt-mark manual python-socksipy
4
14.02.2014, 17:43
2 ответа

Вы столкнулись flock команда?

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

---редактирование

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

Включены @alexis Вы корректны при работе в одной файловой системе, но ситуация становится более сложной, когда nfs смонтировала файловые системы.

Неясно от OP точно, какое соединение версий nfs машин/серверов/клиентов включены, но я думал, что было достаточно сказать, "Вам нужен лучший механизм синхронизации, чем "касание - комната" и действительно, OP предлагает это вид работ, но имеет 1 в 15k шансе отказа. Таким образом, я предложил или, найдите лучший способ синхронизировать или кодировать вокруг этого.

После небольшого расследования на предмете я нашел некоторые ссылки, которые действительно показывают "дефекты" в nfs, которые указывают, что удаление файла не работает как ожидалось через nfs. Больше, существует, различия между nfs v3, и v4, конкретно для обращения к этому дефекту также nfs4 мог, работая по-другому, но не делает или иначе он повредил бы совместимость с клиентами старшего возраста.

Этот документ nfs суммирует ситуацию, это описывает глупое, переименовывают, который был представлен для кодирования вокруг проблемы, и rfc 5661 NFS 4.1 обеспечивает более подробную информацию.

- редактирование 2

Извлечение одного абзаца из вышеупомянутых ссылок:

Из-за дизайна протокола NFS нет никакого пути к файлу, который будет удален из пространства имен, но все еще останется используемым приложением. Таким образом клиенты NFS должны эмулировать это использование, что уже существует в протоколе. Если открытый файл является несвязанным, клиент NFS переименовывает его к специальному имени, которое похоже на ".nfsXXXXX". Это "скрывает" файл, в то время как это остается используемым. Это известно, поскольку "глупый переименовывают". Обратите внимание, что серверы NFS не имеют никакого отношения к этому поведению.

2
27.01.2020, 20:58
  • 1
    , который я сделал, но я считал, что он не работает над nfs, монтируется. Кроме того, как это гарантировало бы это mv на самом деле завершено перед возвратом? –  Christoph 13.02.2014, 13:38
  • 2
    я не думаю, существует какая-либо причина поместить файл блокировки на ту файловую систему? –  X Tian 13.02.2014, 13:52
  • 3
    Для чего я использовал бы файл блокировки в этом случае? Я не думаю, что это помогло бы решению моей проблемы. –  Christoph 13.02.2014, 14:33
  • 4
    я думаю обсуждение, которое мы имели (мы, вероятно, должны были переместить это для обсуждения) был очень полезен, поэтому как мы можем завершить это? Я мог добавить как ответ код, который я теперь использую. –  Christoph 14.02.2014, 16:45
  • 5
    Вы могли добавить свой код как ответ на Ваш собственный вопрос. Я думаю, что другие нашли бы это полезным. спасибо за канал назад. –  X Tian 14.02.2014, 17:38

Идея № 1 - альтернативный подход?

Вместо touch файл, что, если Вы ожидали mv обработайте для завершения вместо этого.

$ mv $tempDir $finishedCasesDir & # copy case to result directory
$ wait %1 && touch $finishedCasesDir/$caseName/done

Это только коснется файла когда mv процесс завершился.

Пример

Вот пример с помощью sleep управляйте как помогание для Вашего mv команда.

время начала

$ date
Thu Feb 13 21:23:33 EST 2014

запустите моделируемую команду "mv"

$ sleep 10 &
[1] 28561

мы затем "ожидаем" его для окончания

$ wait %1 && echo 'all done!'
[1]+  Done                    sleep 10
all done!

подтверждение, что мы ожидали ~10 secs.

$ date
Thu Feb 13 21:23:48 EST 2014

продолжить

$ ...boost program can then run...

Идея № 2 - проблема NFS?

На основе обратной связи от @Gilles я не понял, что Вы работали с этими файлами по NFS. Я полагаю, что Gilles на 100% корректен, я также встретился с подобными проблемами при работе с файлами по NFS, где процесс может все еще иметь доступ к смонтированному каталогу NFS, который Вы пытаетесь удалить. Когда Вы сделаете этот NFS будет обычно создавать a .nfsXXXX файл в каталоге, который помешает Вашим попыткам приложений Повышения удалить файл, так как это эффективно не пусто.

Примечание: Наличия оболочки, CWD которой (Текущий Рабочий Каталог) является подкаталогом в этом монтировании NFS, достаточно для порождения этой проблемы.

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

выборка от вышеупомянутой статьи
% echo test> foo
% tail -f foo
test
^Z
Suspended
% rm foo
% ls -A
.nfsB23D
% rm .nfsB23D
% ls -A
.nfsC23D
% lsof .nfsC23D
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
tail    1257 robh    0r  VREG  176,6        5 3000753 .nfsC23D
%

Уведомление: можно использовать инструмент lsof определить, какой процесс поддерживает дескриптор файла.

Ссылки

1
27.01.2020, 20:58
  • 1
    я в настоящее время ожидаю mv завершаться без запаздывания &. Делает mv & плюс wait %1 действительно измените ситуацию, что касается файловой системы? –  Christoph 14.02.2014, 10:25
  • 2
    @Christoph - на основе Вашего описания, что Ваше повышение базирующееся приложение C не может удалить каталог, b/c mv по-видимому, не закончил опустошать каталог, предшествующий, я сказал бы, попробуйте его и посмотрите. –  slm♦ 14.02.2014, 11:06
  • 3
    То же исключение, выданное remove_all. Это не означает, что мое предыдущее обходное решение действительно работает лучше (который, возможно, был удачей). –  Christoph 14.02.2014, 11:35
  • 4
    я вполне уверен, это не помогло бы, на самом деле он имеет больше шанса сбоя. Исходный код работал бы, если бы это не было для NFS: логически, done только создается после mv завершается. Я подозреваю, что существует .nfsXXX файлы оставили позади на сервере, которые еще не удалены; done создается локально, таким образом, это замечено локально без распространения в прямом и обратном направлениях к серверу. –  Gilles 'SO- stop being evil' 14.02.2014, 17:45
  • 5
    @Gilles - спасибо я думаю, что Вы мертвы на этом NFS проблемы, я добавил это к моему также. –  slm♦ 14.02.2014, 18:12

Теги

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