Я предположил бы, что необходимость получить доступ к различным именам файлов на дьяволе и производственных полях является взломом, необходимо рассмотреть удаление.
if (hostname = productionserver) ...
cp
не знает об открытых файлах. Таким образом, если первый пользователь загрузит большой файл, и cronjob (или любой другой процесс) начинает копировать этот файл, то он только скопирует столько, сколько был уже записан. Можно думать об этом таким образом - cp
делает копию того, что в настоящее время находится на диске, неважно, если файл завершен. Иначе Вы не могли скопировать файлы журнала, например.
cp
не знает то, что другие программы могут иметь открытые файлы. Нет никакого волшебства в cp
. Дизайн Unix целеустремленно старается не помещать любой вид, соединяет файлы, если нет неопровержимый довод (заставляющий значение, что ядру нужен он). По этой теме посмотрите, что перенаправление производит в файл, применяют блокировку на файл?
Такие ситуации, где файл производится производителем и, однажды завершенный, использованный потребителем, распространены. Обычный способ обработать это состоит в том, чтобы сделать, чтобы производитель записал временный файл, который потребитель не будет искать, затем после того как производитель закончен, перемещают файл в место, где потребитель найдет его. Перемещение файла (в той же файловой системе) является атомарной операцией: в какой-то момент, для потребителя, файл изменяется от того, чтобы не быть там к тому, чтобы быть там.
Поэтому примите меры, чтобы Ваше задание загрузки переместило файлы в другой каталог, когда оно закончит делать загрузку. Укажите на задание крона на этот другой каталог.
Кажется, что Вы хотите сделать задание синхронизации dir.
Поскольку-u, - обновляют опцию cp
скопируйте только, когда ИСХОДНЫЙ ФАЙЛ является более новым, чем целевой файл или когда целевой файл отсутствует
Таким образом, можно добавить cronjob такой как cp -auv SOURCEDIR/* DESTDIR
который скопирует те файлы, время изменения которых изменили. Это означает DESTDIR
в конечном счете получит полную копию, в то время как загрузка закончилась.
rsync
может сделать то же задание. например, rsync -av SOURCEDIR/ DESTDIR
.
Хотя-a опция применяется, некоторые указанные атрибуты (например, владение) могут только быть сохранены суперпользователем.
Посмотрите man cp
, man rsync
для деталей.
fuser
+cp
. Такая копия действительно была бы очень ненадежна. Это не скопирует файла, который открыт в текстовом редакторе, например. – Krzysztof Adamski 10.10.2012, 16:14lsof
? Вывод этого предназначен, чтобы быть легким обработать. Вы могли отфильтровать открываемые файлы (скажите экземпляромcp
) для записи. – Wojtek Rzepala 11.10.2012, 14:40fuser
конечно), поскольку этот инструмент не может показать все файлы. – Krzysztof Adamski 11.10.2012, 15:02