LINUX.ORG.RU
ФорумAdmin

rsync удаляет открытые файлы

 ,


0

1

Есть 3 сервака, которые сливают записи на 1 хранилище. Никакой пост-обработкой данных серваки не занимаются, поэтому данные эти там не впились, их проще сразу снести.

/usr/bin/rsync -raz --progress --size-only --remove-sent-files /projects/recordings/ site.com:/var/www/storage/recordings/

Все было бы прекрасно, но rsync копирует (и удаляет) и файлы, которые не были закрыты, т.е. те, в которые еще происходит запись. А софт потом ругается, мол: агдефайл?

Я решил lsof'ом посмотреть что там не закрыто, кинуть файлы в exclude list для копирования rsync и радоваться жизни. Получилось что-то такое:

# выхлоп вида /projects/recordings/<uid>/<path>/2012-07-16 13:24:32.646970-<id>.WAV
lsof | grep /projects/recordings/.\\+\\.\\S\\+ -o | sort | uniq > /tmp/rsync.exclude

/usr/bin/rsync -raz --progress --size-only --remove-sent-files --exclude-files=/tmp/rsync.excldude /projects/recordings/ site.com:/var/www/storage/recordings/

# поменяем владельца на помойке
ssh storage@site.com chown -hR storage:storage /var/www/storage/recordings

Но rsync видимо хочет увидеть там шаблоны (--exclude-from=FILE read exclude >>patterns<< from FILE), а не абсолютные пути.. да еще и с пробелами. И тут меня все опечалило.

Поэтому есть 2 вопроса: 1) что можно взять вместо rsync (что умеет не трогать открытое) 2) как rsync обучить не трогать чужое



Последнее исправление: DoctorSinus (всего исправлений: 1)

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

ae1234 ★★
()

Между вызовом lsof и rsync ситуация может поменятся, ваше решение не вариант.

Разносите файлы по разным каталогам, как уже посоветовали. Если софт сам не умеет это делать, пусть перемещает файлы (mv) отдельный скрипт. И вобще, не совсем понятно, почему софт ругается «мол: агдефайл», он что, пишет в файл, потом закрывает, а потом открывает на дозапись?

mky ★★★★★
()
Ответ на: комментарий от mky

И вобще, не совсем понятно, почему софт ругается «мол: агдефайл», он что, пишет в файл, потом закрывает, а потом открывает на дозапись?

По lsof'у не закрывает. Просто софт делает exec скрипта с именем файла, которого нет и в общий лог падает ворнинг. Я некорректно выразился.

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

division_hell
() автор топика
Ответ на: комментарий от division_hell

Пожалуй буду просто удалять в полночь файлы старше 1 дня.

division_hell
() автор топика
15 ноября 2012 г.

как rsync обучить не трогать чужое

1. man inotify или incron, подписаться на close, запускать доставку(или переименование в необычное имя, чтобы второй раз не открыли). 2. find каталоги -type f -not -exec /sbin/fuser '{}' ';' -exec доставка

DonkeyHot ★★★★★
()
Ответ на: комментарий от division_hell

Просто софт делает exec скрипта с именем файла

Ещё проще; добавь вынос в этот скрипт.

DonkeyHot ★★★★★
()
Ответ на: комментарий от zolden

останавливается сервис который пишет файлы, делается снапшот, запускается сервис. со снапшота делается rsync

если речь идет об одностороннем обмене

MikeDM ★★★★★
()
Ответ на: комментарий от MikeDM

И зачем тогда нужна остановка сервиса ? И как это решает проблему открытых файлов ?

Вариант с inotify выглядит гораздо более логичным.

hidden_4003
()
Ответ на: комментарий от MikeDM

Сервис нельзя останавливать из оригинального сообщения очевидно, что речь идет о телефонии.

Более того снапшот не решает проблему удаления файлов, придется сверять с живой системой и удалять.

hidden_4003
()
Ответ на: комментарий от hidden_4003

выхлоп lsof и последующая работа по нему может быть печальна ибо данные об открытых файлах могут устареть.

MikeDM ★★★★★
()
Ответ на: комментарий от MikeDM

Не совсем печально. На серваке, который пишет файл некому открывать файл повторно. Т.е.:

  • началась запись в файл
  • lsof нудно и долго выполнялся, в вывод попал устаревший файл, который уже к моменту выхода из lsof успел записаться
  • запустился rsync
  • rsync не копирует файл, который уже можно было бы и скопировать

То есть файл подцепится на следующей итерации. С inotify почитаю маны, может перепишу по-человечески.

division_hell
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.