我的情况几乎与this question完全相同,但接受的答案对我来说根本不起作用。制作这个简单的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
。
答案 0 :(得分:3)
我在标准的Debian Wheezy上测试过。您的脚本面临的问题来自于当前工作目录(CWD)不是您所期望的事实。
在打开操作中设置绝对路径是一种避免它的方法:
f = open('/home/pi/test.txt', 'a+')
首先,如果test.txt
的事件更改再次触发脚本,我担心无限递归,但它似乎由incron
处理。
由于incron
触发stderr丢失,因此使用./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
并且在文件系统上没有要求的权限。