2013-05-11 2 views
2

У меня есть сценарий bash, который работает на OSX.
Нужно управлять некоторыми файлами на сетевом ресурсе (общий ресурс AFP на NAS Synology).Bash on OSX: Как определить, используется ли сетевой файл (AFP)?

К сожалению, эти файлы иногда все еще записываются при запуске скрипта.

Как определить, используется ли файл или нет?

Обычный метод - это «lsof», но, похоже, он не работает в сетевых файлах, если другой пользователь приходит от другого клиента в локальной сети.

Я могу просто попытаться переименовать файл. Я полагаю, что это не удастся, если файл используется, но это далеко не изящно.

У кого-нибудь есть лучшее решение?

+0

Что-нибудь в этом [Обсуждение Apple] (https://discussions.apple.com/thread/3252589?start=0&tstart=0) помощь по резьбе? – summea

+0

и в этом обсуждении общего общего файла общей сети доступа http://serverfault.com/questions/61086/concurrent-nfs-access –

+0

@summea Этот поток обсуждает вещи с точки зрения сервера, на котором размещена эта доля. Я на стороне клиента. – Tonny

ответ

3

Это не проблема, которая вообще разрешима. Типичным решением является запись файла во временное место, а затем перенос его в конечный каталог обработки (поскольку перемещение внутри файловой системы обычно является атомарным). Если вы не можете контролировать, как и где файл записывается, вы остаетесь с эвристикой, в частности, делаете что-то вроде просмотра файла и видите, не выросло ли оно «некоторое время», но ни один из них не особенно хорош по сравнению с разделом письменность от enqueuing.

+0

Я сам уже пришел к такому выводу. Просто отправил сюда, чтобы увидеть, пропустил ли я что-то, но, видимо, нет. Поэтому я попытаюсь сначала переименовать файл (атомная операция, как вы говорите), а затем работать с переименованным файлом. Дополнительным преимуществом является то, что при переименовании я могу избавиться от пробелов в имени файла. Делает остальную часть скрипта значительно проще. Было бы кошмаром с пробелами. – Tonny

+0

Пробелы * далеко * от опасных символов в именах файлов. Вы должны делать правильное цитирование в сценариях. Там не обойтись. –

+0

@KenThomases Я знаю. Поверьте мне, я знаю ... К счастью для меня, источником всех файлов являются Windows или OSX. Так что большинство опасных вещей уже не разрешено ОС. Если что-то произойдет через него, это вызовет переименование, чтобы перетащить подгонку, которую обработает ошибка, и файл будет пропущен. Для этого достаточно. Файл журнала, созданный скриптом, все равно будет проверяться оператором, и он/она может вручную разобраться с проблемными случаями. – Tonny

1

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

Если файл является приватным для вашей программы, все экземпляры вашей программы могут участвовать в совместной схеме блокировки. Например, вы можете использовать команду lockfile. Будьте уверены, что очистите файлы блокировки даже перед сигналами/исключениями. Вы можете использовать встроенную команду trap, чтобы помочь в этом. См. here для пояснения.

+0

Хотел бы я. Файлы создаются различными способами загрузки (ftp, scp, rsync). Мой скрипт должен прочитать их один раз, чтобы преобразовать их в другой формат, а затем (если конверсия прошла успешно) переместите оригинал в архивное расположение. Конверсия будет успешной (без ошибок), если файл имеет только блокировку чтения, но выход будет разбит (и поэтому бесполезен), если файл еще не был полностью загружен, и у меня нет способа обнаружить это условие. – Tonny

Смежные вопросы