python inotify 监控 In_closted_write 和 in_moved_to 事件

Posted

技术标签:

【中文标题】python inotify 监控 In_closted_write 和 in_moved_to 事件【英文标题】:python inotify to monitor for In_closted_write and in_moved_to events 【发布时间】:2017-12-09 02:27:19 【问题描述】:

我正在监视要移动或创建的新文件的目录。 在检测到新文件后,我调用另一个 python 脚本来处理该文件。

#!/usr/bin/python

import os
import signal
import sys
import logging
import inotify.adapters
import subprocess

_DEFAULT_LOG_FORMAT = ''

_LOGGER = logging.getLogger(__name__)

def _configure_logging():
    _LOGGER.setLevel(logging.DEBUG)

    ch = logging.StreamHandler()

    formatter = logging.Formatter(_DEFAULT_LOG_FORMAT)
    ch.setFormatter(formatter)

    _LOGGER.addHandler(ch)

def exit_gracefully(signum, frame):
    signal.signal(signal.SIGINT, original_sigint)
    sys.exit(1)

    signal.signal(signal.SIGINT, exit_gracefully)

def main():
    i = inotify.adapters.Inotify()

    i.add_watch(b'/home/sort/tmp')

    try:
        for event in i.event_gen():
            if event is not None:
                if 'IN_MOVED_TO' in event[1] or 'IN_CLOSE_WRITE' in event[1]:
                    (header, type_names, watch_path, filename) = event
                    _LOGGER.info("%s" #"WD=(%d) MASK=(%d) COOKIE=(%d) LEN=(%d) MASK->NAMES=%s "
                         #"WATCH-PATH=[%s]"
                         "FILENAME=%s" + "/" + "%s",
                         type_names,#header.wd, header.mask, header.cookie, header.len, type_names,
                         watch_path.decode('utf-8'), filename.decode('utf-8'))
                fnp = str(event[2] + "/" + event[3])
                print fnp
                proc = subprocess.Popen([orgpath, fnp], stderr=subprocess.STDOUT, bufsize=1)
                #proc.communicate()
    finally:
        i.remove_watch(b'/home/sort/tmp')

if __name__ == '__main__':
    _configure_logging()

    orgdir = os.path.dirname(os.path.realpath(sys.argv[0]))
    orgpath = os.path.join(orgdir, "organize.py")

    original_sigint = signal.getsignal(signal.SIGINT)
    signal.signal(signal.SIGINT, exit_gracefully)
    print("Watching /home/sort/tmp for new files")
    main()

最终目标是在我调用 API 以抓取元数据时一次只处理一个文件。在短时间内对 API 进行多次调用可能会导致 API 密钥被禁止或暂时阻止。

现在,当我将多个文件复制到监视目录中时,脚本会同时在每个文件上调用。

【问题讨论】:

【参考方案1】:

尝试放置一个for循环来运行python文件..

for files in directory:
    ...code that runs the python file

如果它仍然运行得太快,您可以设置一个计时器来限制 API 调用

import time
for files in directory:
    ...code that runs the python file
    time.sleep(5)

【讨论】:

for 循环会绕过 orgpath 还是子进程? 可能是 proc/subprocess,但我不太确定.. 也许它的 main() 函数.. 我不是 100% 确定它是如何工作的,我无法复制它,因为我不知道组织是什么。 py 会大声笑.. oraganize.py 尚未完成,但仍处于当前形式。 它处理存档以进入制作 api。将结果写入 json。进行 2 次额外的 api 调用以获取更多信息,这些信息也写入 json。 api 调用的结果最终被写入 sqlite 数据库。然后,该文件将移动到根据从 api 调用获得的结果创建的文件夹。如果无法通过 API 识别文件,则会将其移至另一个文件夹进行手动处理。

以上是关于python inotify 监控 In_closted_write 和 in_moved_to 事件的主要内容,如果未能解决你的问题,请参考以下文章

inotify事件监控工具

Python日志监控系统处理日志(pyinotify)

inotify事件监控

inotify,inotify_add_watch() 监控多个目录,c++

inotify监控文件变化

inotify事件监控