Dropbox и pyinotify

У меня только что появился iPad, и я по глупости получил приложение TexTouch. Глупо, потому что из-за правил Apple TexTouch не может компилировать Tex. Он синхронизирует файл .tex с компьютером с помощью Dropbox. На удаленном компьютере его ловит другая программа, которая компилирует файл .tex в PDF и отправляет его обратно. Но (сюрприз!) Эта удаленная программа только в Windows и Mac. И я на Linux. Я подумал, а почему бы не использовать inotify? Чтобы упростить задачу, я на самом деле использовал pyinotify, поэтому мне не пришлось бы иметь дело с тоннами компиляции. НО, когда Dropbox удаляет файл, вот, на просторечии pyinotify, события, которые происходят. (Очевидно, что «first doc.tex» - это имя синхронизируемого файла.)

event: <Event dir=False mask=0x20 maskname=IN_OPEN name=first doc.tex path=/home/eje211/Dropbox/TexTouch pathname=/home/eje211/Dropbox/TexTouch/first doc.tex wd=1 >
event: <Event dir=False mask=0x1 maskname=IN_ACCESS name=first doc.tex path=/home/eje211/Dropbox/TexTouch pathname=/home/eje211/Dropbox/TexTouch/first doc.tex wd=1 >
event: <Event dir=False mask=0x10 maskname=IN_CLOSE_NOWRITE name=first doc.tex path=/home/eje211/Dropbox/TexTouch pathname=/home/eje211/Dropbox/TexTouch/first doc.tex wd=1 >
event: <Event cookie=151401 dir=False mask=0x40 maskname=IN_MOVED_FROM name=first doc.tex path=/home/eje211/Dropbox/TexTouch pathname=/home/eje211/Dropbox/TexTouch/first doc.tex wd=1 >
event: <Event cookie=151402 dir=False mask=0x80 maskname=IN_MOVED_TO name=first doc.tex path=/home/eje211/Dropbox/TexTouch pathname=/home/eje211/Dropbox/TexTouch/first doc.tex wd=1 >
event: <Event dir=False mask=0x4 maskname=IN_ATTRIB name=first doc.tex path=/home/eje211/Dropbox/TexTouch pathname=/home/eje211/Dropbox/TexTouch/first doc.tex wd=1 >
event: <Event dir=False mask=0x20 maskname=IN_OPEN name=first doc.tex path=/home/eje211/Dropbox/TexTouch pathname=/home/eje211/Dropbox/TexTouch/first doc.tex wd=1 >
event: <Event dir=False mask=0x1 maskname=IN_ACCESS name=first doc.tex path=/home/eje211/Dropbox/TexTouch pathname=/home/eje211/Dropbox/TexTouch/first doc.tex wd=1 >
event: <Event dir=False mask=0x10 maskname=IN_CLOSE_NOWRITE name=first doc.tex path=/home/eje211/Dropbox/TexTouch pathname=/home/eje211/Dropbox/TexTouch/first doc.tex wd=1 >
event: <Event dir=False mask=0x20 maskname=IN_OPEN name=first doc.tex path=/home/eje211/Dropbox/TexTouch pathname=/home/eje211/Dropbox/TexTouch/first doc.tex wd=1 >
event: <Event dir=False mask=0x1 maskname=IN_ACCESS name=first doc.tex path=/home/eje211/Dropbox/TexTouch pathname=/home/eje211/Dropbox/TexTouch/first doc.tex wd=1 >
event: <Event dir=False mask=0x10 maskname=IN_CLOSE_NOWRITE name=first doc.tex path=/home/eje211/Dropbox/TexTouch pathname=/home/eje211/Dropbox/TexTouch/first doc.tex wd=1 >
event: <Event dir=False mask=0x20 maskname=IN_OPEN name=first doc.tex path=/home/eje211/Dropbox/TexTouch pathname=/home/eje211/Dropbox/TexTouch/first doc.tex wd=1 >
event: <Event dir=False mask=0x1 maskname=IN_ACCESS name=first doc.tex path=/home/eje211/Dropbox/TexTouch pathname=/home/eje211/Dropbox/TexTouch/first doc.tex wd=1 >
event: <Event dir=False mask=0x10 maskname=IN_CLOSE_NOWRITE name=first doc.tex path=/home/eje211/Dropbox/TexTouch pathname=/home/eje211/Dropbox/TexTouch/first doc.tex wd=1 >
event: <Event dir=False mask=0x20 maskname=IN_OPEN name=first doc.tex path=/home/eje211/Dropbox/TexTouch pathname=/home/eje211/Dropbox/TexTouch/first doc.tex wd=1 >
event: <Event dir=False mask=0x1 maskname=IN_ACCESS name=first doc.tex path=/home/eje211/Dropbox/TexTouch pathname=/home/eje211/Dropbox/TexTouch/first doc.tex wd=1 >
event: <Event dir=False mask=0x10 maskname=IN_CLOSE_NOWRITE name=first doc.tex path=/home/eje211/Dropbox/TexTouch pathname=/home/eje211/Dropbox/TexTouch/first doc.tex wd=1 >

Что я могу с этим поделать? Единственные события, которые кажутся уникальными, - это события IN_MOVE_FROM и IN_MOVE_TO. Но похоже, что следить за ними - это ПЛОХАЯ идея. Есть ли способ обнаружить событие, инициированное Dropbox? Должен ли я использовать что-то другое, кроме inotify или pyinotify?


person eje211    schedule 25.09.2010    source источник


Ответы (2)


Ну, IN_OPEN (файл открыт для чтения), IN_ACCESS (файл открыт) и IN_ATTRIB (атрибуты файла изменены), очевидно, не то, что вам нужно. IN_CLOSE_NOWRITE означает, что файл был закрыт для чтения (т.е. никакие изменения не могли быть внесены), так что это тоже не то, что вам нужно. Значит, это должно быть либо IN_MOVED_FROM, либо IN_MOVED_TO. Вы уверены, что никаких других событий не происходит? Если да, то файл, вероятно, создается где-то в другом месте, а затем перемещается в свое окончательное местоположение в ~/Dropbox.

person Wim Leers    schedule 08.08.2011

У меня работает скрипт, который следит за IN_MOVED_TO. Каждый раз, когда Dropbox сбрасывает новый файл, он запускается. Вы должны использовать IN_MOVED_TO.

<Event cookie=63896 dir=False mask=0x80 maskname=IN_MOVED_TO name=test.zip path=/home/bpotter/Dropbox/Apps/Backup pathname=/home/bpotter/Dropbox/Apps/Backup/test.zip wd=1 >
person bjcubsfan    schedule 30.03.2017