incron на Raspbian не работает

У меня практически такая же ситуация, как и в этом вопросе, за исключением того, что принятый ответ не у меня вообще работает. Создание этого простого скрипта Python - моя вторая попытка; отображение текста и перенаправление его в файл тоже ничего не делает. Я использую дистрибутив Raspbian linux.

pi@raspberrypi ~ $ incrontab -l
/home/pi IN_CREATE,IN_DELETE /home/pi/test.py

pi@raspberrypi ~ $ cat test.py 
#! /usr/bin/python3 
f = open('test.txt', 'a+')
f.write('success!\n')
f.close()

pi@raspberrypi ~ $ touch abc.123; rm abc.123

pi@raspberrypi ~ $ tail -n 3 /var/log/syslog
May 17 00:17:09 raspberrypi incrond[1799]: (pi) CMD (/home/pi/test.py )
May 17 00:18:36 raspberrypi incrond[1799]: (pi) CMD (/home/pi/test.py )
May 17 00:18:36 raspberrypi incrond[1799]: (pi) CMD (/home/pi/test.py )

pi@raspberrypi ~ $ ls
bin  Desktop  python_games  test.py

Обратите внимание на отсутствие test.txt в домашнем каталоге.


person kevlar1818    schedule 17.05.2013    source источник
comment
ммм, не следует ли в первой строке test.py читать #!/usr/bin/python3 вместо пробела между шебангом и косой чертой?   -  person demure    schedule 17.05.2013
comment
пространство не имеет значения   -  person kevlar1818    schedule 17.05.2013
comment
Если вы собираетесь заявить, что решение не работает, по крайней мере опубликуйте, что происходит, когда вы примените решение, в отличие от того, что происходит, когда вы делаете ту же ошибку, что и спрашивающий в связанном вопрос.   -  person Cairnarvon    schedule 03.06.2013
comment
@Cairnarvon Я согласен с вами. Кстати, предыдущий вопрос не объясняет точно, почему абсолютный путь к файлу решает проблему. Найти действительно было несложно.   -  person Yves Martin    schedule 03.06.2013


Ответы (1)


Я тестировал стандартный Debian Wheezy. Проблема, с которой сталкивается ваш скрипт, связана с тем, что текущий рабочий каталог (CWD) не соответствует вашим ожиданиям.

Установка абсолютного пути в вашей открытой операции - способ избежать этого:

f = open('/home/pi/test.txt', 'a+')

Во-первых, я опасаюсь бесконечной рекурсии, если события для test.txt изменений снова запускают скрипт, но, похоже, это обрабатывается incron.

Поскольку stderr теряется при запуске с помощью incron, важно протестировать сценарий вручную с помощью ./test.py.

Вот вариант вашего скрипта с дополнительной информацией благодаря опции $@:

#! /usr/bin/python3
import sys
import os
f = open('/home/pi/test.txt', 'a+')
f.write('success on ' + sys.argv[1] + ' with CWD=' + os.getcwd() + '\n')
f.close()

Что зарегистрировано таким образом:

$ incrontab -l
/home/pi IN_CREATE,IN_DELETE /home/pi/test.py $@

Теперь вы увидите в /home/pi/test.txt

success on /home/pi/ with CWD=/

что объясняет, что ваш сценарий сначала пытается записать /test.txt и не требует для этого разрешения в файловой системе.

person Yves Martin    schedule 31.05.2013