Как “CP” обрабатывает открытые файлы?

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

  • Вы могли использовать управление версиями для хранения дьявола и производственного ответвления того же проекта. Продолжайте объединяться, дьявол в Ваше производство переходят, но используют Ваш небольшой сценарий для хранения кода в производственном состоянии прежде, чем фиксировать то ответвление. Используйте свой сервер для контроля производственное ответвление, или только rsync что один через.
  • У Вас могло быть немного серверного кода, решают который имя файла использовать: if (hostname = productionserver) ...
  • Вы могли использовать серверное перенаправление для подавания различных файлов под тем же URL запроса на основе имени хоста или своего рода файла тега в проекте.
15
10.10.2012, 15:38
3 ответа

cp не знает об открытых файлах. Таким образом, если первый пользователь загрузит большой файл, и cronjob (или любой другой процесс) начинает копировать этот файл, то он только скопирует столько, сколько был уже записан. Можно думать об этом таким образом - cp делает копию того, что в настоящее время находится на диске, неважно, если файл завершен. Иначе Вы не могли скопировать файлы журнала, например.

17
27.01.2020, 19:49
  • 1
    Спасибо, это - то, что я хотел знать! Существует ли простой способ избежать этого? Я проверил страницу справочника CP, но не нашел ничего из использования. –  Stuffy 10.10.2012, 16:02
  • 2
    Сделать что точно? Скопировать все файлы кроме открытых? Я не думаю, что существует любой простой способ сделать это (кроме записи Вашего собственного сценария, который использует fuser+cp. Такая копия действительно была бы очень ненадежна. Это не скопирует файла, который открыт в текстовом редакторе, например. –  Krzysztof Adamski 10.10.2012, 16:14
  • 3
    @Stuffy, возможно, в Вашем cronjob Вы могли перечислить открытые файлы с lsof? Вывод этого предназначен, чтобы быть легким обработать. Вы могли отфильтровать открываемые файлы (скажите экземпляром cp) для записи. –  Wojtek Rzepala 11.10.2012, 14:40
  • 4
    @WojtekRzepala, я взгляну на это, спасибо. Возможно, я запишу маленький сценарий, который выполняется cronjob –  Stuffy 11.10.2012, 14:56
  • 5
    @Stuffy: Следует иметь в виду, что это не может быть действительно надежно, если это не выполняется пользователем root (та же проблема с fuser конечно), поскольку этот инструмент не может показать все файлы. –  Krzysztof Adamski 11.10.2012, 15:02

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

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

Поэтому примите меры, чтобы Ваше задание загрузки переместило файлы в другой каталог, когда оно закончит делать загрузку. Укажите на задание крона на этот другой каталог.

7
27.01.2020, 19:49

Кажется, что Вы хотите сделать задание синхронизации dir.

Поскольку-u, - обновляют опцию cp

скопируйте только, когда ИСХОДНЫЙ ФАЙЛ является более новым, чем целевой файл или когда целевой файл отсутствует

Таким образом, можно добавить cronjob такой как cp -auv SOURCEDIR/* DESTDIR который скопирует те файлы, время изменения которых изменили. Это означает DESTDIR в конечном счете получит полную копию, в то время как загрузка закончилась.

rsync может сделать то же задание. например, rsync -av SOURCEDIR/ DESTDIR.

Хотя-a опция применяется, некоторые указанные атрибуты (например, владение) могут только быть сохранены суперпользователем.

Посмотрите man cp, man rsync для деталей.

6
27.01.2020, 19:49
  • 1
    Просто остерегайтесь доверия недавним записям в папке назначения---, они не могут быть полными файлами. –  dubiousjim 11.10.2012, 07:05

Теги

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