1

我的情况与这个问题几乎相同,除了接受的答案对我根本不起作用。制作这个简单的 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

4

1 回答 1

3

我已经在标准的 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并且不需要文件系统的权限来执行此操作。

于 2013-05-31T20:20:09.830 回答