Як “cp” обробляє відкриті файли?


15

У мене є два окремі каталоги. Користувач завантажує файл у перший. У фоновому режимі працює cronjob, який копіює файли кожні 5 хвилин у другий каталог.

Що станеться, якщо користувач не закінчив завантаження і cronjob копіює файли? Зауважте, що два каталоги належать різним користувачам, cronjob виконується як root.


будь ласка, прочитайте цей пост, щоб побачити, що відбувається у такому випадку: unix.stackexchange.com/questions/49299/…
Серж

Дякую, хороший пост, який ви написали. Але моє запитання стосувалося більше cp, не взагалі для обробки файлів Linux. Я, хоча, можливо, CP перевіряє, чи файл все ще відкритий і чекає, поки його закриють чи щось.
Душно

Ні. cpНе чекатиме, коли файл буде повністю завантажений. Оскільки ми очікуємо, що швидкість передачі мережі нижче, ніж просто копіювання файлу з одного місця в інше всередині того самого хоста, то в якийсь момент cpдосягне поточного кінця файлу і припинить копіювання. Вирішення вашої проблеми може бути простим: спочатку користувач завантажує файл із якимсь спеціальним набореним ім'ям файлу (наприклад, заздалегідь передбаченим .(крапковий символ). Коли передача виконана, користувач перейменовує його на початкове ім'я. Потім завдання cron виглядає лише для файлів, які не починаються ..
Серж

Відповіді:


17

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


Дякую, ось що я хотів знати! Чи є простий спосіб цього уникнути? Я перевірив сторінку cp man, але нічого не знайшов.
Задушливе

Що робити саме? Щоб скопіювати всі файли, крім відкритих? Я не думаю, що це є простий спосіб зробити це (крім написання власного сценарію, який використовує fuser+ cp. Така копія справді була б дуже ненадійною. Вона не копіює жодного файлу, відкритого в текстовому редакторі, наприклад.
Krzysztof Адамські

@Stuffy, можливо, у твоєму завданні ви могли перелічити відкриті файли lsof? Висновок цього повинен бути простим в обробці. Ви можете фільтрувати відкриті файли (скажімо, екземпляром cp) для запису.
Войтек Жепала

@WojtekRzepala, я погляну на це, дякую. Можливо, я напишу невеликий сценарій, який виконуватиметься за допомогою cronjob
Stuffy

@Stuffy: Майте на увазі, що це може бути не надто надійним, якщо він не запускається кореневим користувачем (така ж проблема і fuserзвичайно), оскільки цей інструмент може відображати не всі файли.
Кшиштоф Адамський

7

cpне знає, які інші програми можуть відкрити файли. У цьому немає ніякої магії cp. Дизайн unix цілеспрямовано дозволяє уникнути будь-якого типу замків у файлах, якщо немає вагомих причин (переконливий сенс, що це потребує ядра). З цієї теми див. Статтю Чи застосовується перенаправлення виводу до файлу блокування на файл?

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

Тож домовтеся про те, щоб ваше завдання завантаження перемістило файли в інший каталог, коли закінчується завантаження. Вкажіть завдання cron на цей інший каталог.


6

Схоже, ви хочете виконати роботу з синхронізацією режиму.

Тому що опція -u, --оновитиcp

копіюйте лише тоді, коли файл SOURCE новіший за цільовим файлом або коли файл відсутній

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

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

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

Див man cp, man rsyncдля деталей.


Будьте обережні, покладаючись на останні записи в папці призначення --- вони можуть бути не повноцінними файлами.
сумнівним
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.