Запуск скрипта Python в incrontab в Debian

У меня есть пользователь, dropbox, который запускает демон Dropbox, я хочу отслеживать каталоги в каталоге Dropbox на наличие новых файлов и запускать скрипт python, когда они появляются.

У меня есть скрипт Python, который я знаю работает:

$ /home/dropbox/monitor.py
Trying to get lock
Got lock, waiting for Dropbox to be idle
Dropbox idle
Finding instructions
Done, releasing lock

У меня есть запись incrontab:

$ incrontab -l
/home/dropbox/Dropbox IN_CREATE /home/dropbox/monitor.py | logger
/home/dropbox/test IN_CREATE logger "$$ $@ $# $% $&"

Когда я добавляю файл в тестовый каталог, я вижу вывод в /var/log/syslog:

$ touch /home/dropbox/test/a
$ tail /var/log/syslog
...
Nov  9 10:18:27 vps incrond[1354]: (dropbox) CMD (logger "$ /home/dropbox/test a IN_CREATE 256")
Nov  9 10:18:27 vps logger: "$ /home/dropbox/test a IN_CREATE 256"
...

Однако, когда я добавляю файл в каталог Dropbox, команда, похоже, не запускается:

$ touch /home/dropbox/Dropbox/a
$ tail /var/log/syslog
...
Nov  9 10:24:16 vps incrond[1354]: (dropbox) CMD (/home/dropbox/monitor.py | logger)
...

Таким образом, демон incron замечает новый файл, и правильная команда оказывается выполненной, но фактически никогда не выполняется. Также нет никаких сообщений об ошибках. Похоже, что incrontab можно использовать только для запуска самых простых команд.

Это может быть похож на вопрос:

но я думаю, что у меня нет проблем env, каждый путь абсолютен. Я пытался изменить .../monitor.py в /usr/bin/python2.7 .../monitor.py на всякий случай, но это не имело никакого значения.

редактировать

Деннис Каарсемакер предложил решение, которое заключалось в том, что incrontab выполнял мою команду не в режиме cron и что это могло вызывать проблему. К сожалению, я до сих пор не могу заставить его работать.

Сначала я удалил лишние вещи из incrontab:

$ incrontab -l
/home/dropbox/Dropbox IN_CREATE /home/dropbox/monitor.py

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

Затем я создал скрипт bash, который содержал инструкцию по выполнению моего скрипта:

$ vim test.sh
logger "$PATH"
/usr/bin/python2.7 /home/dropbox/monitor.py | logger

Это дает следующий вывод:

$ tail /var/log/syslog
Nov  9 23:50:28 vps incrond[1354]: (dropbox) CMD (/home/dropbox/test.sh)
Nov  9 23:50:28 vps logger: /usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin

Итак, ничего из файла monitor.py, и мы видим, что каталог, содержащий python, находится в среде incrontab, поэтому нам даже не нужно указывать путь так же абсолютно, как мы.

2 ответа

Я чувствую себя идиотом за то, что заметил это.

Мой скрипт monitor.py пытается получить блокировку файла, прежде чем он начнет возиться с дропбоксом. Это в основном для предотвращения вмешательства других экземпляров monitor.py. Путь к файлу, который я блокирую, не был абсолютным.

Итак, урок для тех, кто найдет эту страницу в будущем. Проверьте каждый путь, который вы используете, чтобы убедиться, что он 1) на пути 2) абсолютный.

Существует большая разница между cron и incron: то, как они выполняют команды. Крон видит команду как один аргумент и вызывает оболочку для ее запуска. Примерно так:

execvp('/bin/sh', ['/bin/sh', '-c', 'whatever is in the crontab']);

Таким образом, все конструкции оболочки, как && а также | Работа. Incron не делает этого, он анализирует саму команду и выполняет ее напрямую. Так что incron работает в вашем случае:

execvp('/home/dropbox/monitor.py', ['/home/dropbox/monitor.py', '|', 'logger']);

Так что ваш monitor.py запускается с | а также logger в качестве аргументов. Вы можете обернуть ваш скрипт в другой скрипт, который делает monitor.py | logger или используйте питона logging модуль для ведения журнала из файла monitor.py.

Другие вопросы по тегам