每当在目录中创建文件时,如何运行 Python 脚本?

每当在目录中创建文件时,如何运行 Python 脚本?

所以,我正在尝试完成这个有点简单的任务,但还没有成功。我希望现在情况有所改变。

目标:

/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”事件,因此您可以在此处添加想要运行的任何代码。

相关内容