所以,我正在尝试完成这个有点简单的任务,但还没有成功。我希望现在情况有所改变。
目标:
/var/www/lager-scanner/filer/pluk_script.py
只要中有新文件就运行/var/www/lager-scanner/filer/Nav/FromNav
,并以用户身份运行www-data
。
有人能告诉我该怎么做吗?
其中的所有文件夹/var/www
均归该www-data
用户和组所有,并具有775
权限。
答案1
不是一个重复,但在接受的答案中这个问题,解释了如何在任意目录中添加或创建文件时运行脚本(或任何命令)。 在您的例子中,唯一需要的事件触发器是:
-e create
此外,由于您没有使用文件路径作为参数,因此可以跳过 -section --format
。
在后台运行的脚本很简单:
#!/bin/bash
DIR="/var/www/lager-scanner/filer/Nav/FromNav"
inotifywait -m -r -e create "$DIR" | while read f
do
# you may want to release the monkey after the test :)
echo monkey
# <whatever_command_or_script_you_liketorun>
done
解释
正如链接问题所解释的那样:
-e create
会注意到新文件创建在目录内。
选项:
-m -r
是使命令在目录中无限期地(“监视”)和递归地运行。
根据这,使用pyinotify
不是最好的选择。
编辑
你在评论中提到它不起作用,和您提到目标文件夹是远程文件夹。虽然不完全相同,但问题似乎与这:
这种变化对于内核来说是不可见的;它完全是在远程发生的。
一个(经过测试的)解决方法是在本地安装远程文件夹。
答案2
以下是 PyPI 上 inotify 页面上示例的精简版本
(https://pypi.python.org/pypi/inotify) 帮助您入门:
import inotify.adapters
import os
notifier = inotify.adapters.Inotify()
notifier.add_watch('/home/student')
for event in notifier.event_gen():
if event is not None:
# print event # uncomment to see all events generated
if 'IN_CREATE' in event[1]:
print "file '{0}' created in '{1}'".format(event[3], event[2])
os.system("your_python_script_here.py")
它创建一个 Inotify 对象,然后使用 add_watch() 方法添加要监视的目录。接下来,它使用 event_gen() 方法从 Inotify 对象创建一个事件生成器。最后,它迭代该生成器
现在,影响监视目录的文件操作将生成一个或多个事件。每个事件都采用具有四个值的元组的形式:
- _INOTIFY_EVENT 元组(为了清楚起见,在下面的输出中省略)
- 描述事件的字符串列表
- 受影响的目录的名称
- 受影响文件的名称
运行上述示例,取消注释第一个打印语句,然后在监视的目录中创建文件“new”,得到以下输出:
((...),['IN_CREATE'],'/home/student','新') 在 '/home/student' 中创建了 'new' 文件 ((...),['IN_ISDIR','IN_OPEN'],'/home/student','') ((...),['IN_ISDIR','IN_CLOSE_NOWRITE'/home/student','') ((...),['IN_OPEN'],'/home/student','新') ((...),['IN_ATTRIB'],'/home/student','新') ((...),['IN_CLOSE_WRITE'],'/home/student','新')
由于在创建新文件时会发生“IN_CREATE”事件,因此您可以在此处添加想要运行的任何代码。