LINUX.ORG.RU

Узнать занят ли файл.


0

1

Примонтирована Samba-директория. В нее время от времени закидываются файлы. Локальный скрипт по cron'у обрабатывает эти файлы. Но, чтобы скрипт не начал обрабатывать неполностью залитый файл, нужна проверка. Как выполнить такую проверку, предполагая, что имя файла известно. Пробовал заливать большой файл и выполнять lsof, fuser - не помогло. В /proc тоже ничего не нашел. Как я понимаю, с файлом в момент записи работает драйвер фс. Как к нему обратиться?

проверяй размер и дату изменения. Если они перестали меняться, то файл возможно уже залит.

sdio ★★★★★
()

В общем случае нет ни одного верного способа это сделать.

В этом частном случае можно мониторить /fd каталог процессов самбы.

vasily_pupkin ★★★★★
()

парсить обрабатываемый файл в выхлопе

smbstatus -L

Zhopin
()

mv — операция атомарная. «Upload» в file.tmp и mv file.tmp file после заливки. Скрипт работает соответственно только с «file».

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

в этом случае он вроде будет показывать занятость даже когда файл просто открыт на том конце обозревателем в explorer?

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

Upload» в file.tmp и mv file.tmp file после заливки

Если есть контроль над процессом заливки, зачем какие-то способы определения готовности?

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

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

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

Мониторил. Имя файла там не светится.

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

lsof ничего не возвращает, smbstatus -L возвращает «No locked files»

newpulsar
() автор топика

Всем спасибо за ответы. Буду по изменению времени или объема проверять.

newpulsar
() автор топика

Я использую это: https://github.com/gregghz/Watcher умеет следить за каталогом рекурсивно, и по определенным событиям выполнять скрипт (например закрыт файл, открытый на запись или файл перемещен с другого места)

xorik ★★★★★
()

А к скрипту заливки файлов у тебя доступ есть? Если есть, то можно копировать файл с каким-нибудь специальным расширением (например, .part), а по завершении копирования возвращать нормальное имя (т.е. убирать .part). Вроде должно прокатить.

Apple-ch ★★
()

после того как файл залит на сервер, скрипт делающий заливку может сделать спец файл filename.done

по наличию done файла можно убедиться, что файл полноценно на месте.

до кучи в done файл можно ложить md5 для проверки

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

Так то оно так, но

for i=1 to 10 
  echo $line >> /path/to/file
  sleep 1
next i

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

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

Да, но неужели у ТС в примонтированную по самба директорию будет вестись такая вот циклическая запись? Там скорее всего виндовые клиенты кидают некую бинарную дрянь, которую нужно обрабатывать...

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

Всякое бывает.

Я бы объединил несколько методов. incron (IN_CLOSE_WRITE) для начала контроля и изменение размера/времени, чтобы убедиться.

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

Некоторые проги могут писать файл кусками. И после каждого куска закрывать файл.

TEX ★★★
()
Ответ на: комментарий от Apple-ch

К сожалению, файлы заливаются не скриптом, а пользователями.

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

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

newpulsar
() автор топика

Всех благодарю за ответы. Воспользовался stat с опцией --format=%Z

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