如何处理要在cron作业中处理的新文件

sal*_*ise 3 python mysql sysadmin hash file-io

如何检查已在脚本中处理过的文件,以便我不再处理这些文件?和/或我现在这样做有什么问题?

您好,我正在使用环形缓冲区选项运行tshark,以便在5MB或1小时后转储到文件.我写了一个python脚本来读取XML中的这些文件并转储到数据库中,这很好.

我的问题是,这实际上是流程密集的,当转换为XML时,其中一个5MB可以变成200MB的文件,所以我不想做任何不必要的处理.

该脚本每10分钟运行一次,每次运行处理约5个文件,因为正在扫描为任何新条目创建文件的文件夹,我将文件的哈希转储到数据库中,并在下次运行时检查哈希值,如果它不在数据库中我扫描文件.问题是,这似乎不是每次都有效,它最终处理它已经完成的文件.当我检查它一直试图处理的文件的哈希值时,它不会出现在数据库的任何地方,因此为什么要反复处理它.

我在脚本的输出中打印出文件名+ hash:

__PRE__

它应该做的唯一文件是每个文件夹一个,所以只有4个文件.这导致不必要的处理,我必须处理重叠的cron作业+其他受影响的服务.

我希望从这篇文章中得到的是一个更好的方法,或希望有人可以告诉我为什么会发生,我知道后者可能很难,因为它可能是一堆原因.

这是代码(我不是编码器,但是系统管理员,所以要善良:P)第30-32行处理哈希比较.提前致谢.

unu*_*tbu 5

处理/处理随机创建的文件的好方法是使用 incron而不是cron.(注意:由于incron使用Linux内核的 inotify系统调用,因此该解决方案仅适用于Linux.)

然而,cron基于日期和时间incron运行作业,根据受监视目录中的更改运行作业.例如,您可以配置incron以在每次创建或修改新文件时运行作业.

在Ubuntu上,调用包incron.我不确定RedHat,但我相信这是正确的软件包:http://rpmfind.net//linux/RPM/dag/redhat/el5/i386/incron-0.5.9-1.el5.rf. i386.html.

安装incron软件包后,请阅读

man 5 incrontab 
Run Code Online (Sandbox Code Playgroud)

有关如何设置incrontab配置文件的信息.您的incron_config文件可能如下所示:

/var/ss01/ IN_CLOSE_WRITE /path/to/processing/script.py $#
/var/ss02/ IN_CLOSE_WRITE /path/to/processing/script.py $#
/var/ss03/ IN_CLOSE_WRITE /path/to/processing/script.py $#
/var/ss04/ IN_CLOSE_WRITE /path/to/processing/script.py $#
Run Code Online (Sandbox Code Playgroud)

然后,要使用incrond守护程序注册此配置,您就可以运行了

incrontab /path/to/incron_config
Run Code Online (Sandbox Code Playgroud)

这里的所有都是它的.现在,无论何时在/ var/ss01,/ var/ss02,/ var/ss03或/ var/ss04中创建文件,该命令

/path/to/processing/script.py $#
Run Code Online (Sandbox Code Playgroud)

运行,$#替换为新创建的文件的名称.

这将消除存储/比较哈希的需要,文件只会在创建后立即处理一次.

只需确保您的处理脚本不会写入受监控目录的顶层.如果是,则incrond将注意到创建的新文件,并再次启动script.py,将您发送到无限循环.

incrond监视各个目录,并不递归监视子目录.所以你可以指示tshark写入/ var/ss01/tobeprocessed,使用incron来监视/ var/ss01/tobeesessed,并让你的script.py写入/ var/ss01,例如.

PS.还有一个用于inotify的python接口,称为pyinotify.与incron不同,pyinotify可以递归地监视子目录.但是,在您的情况下,我不认为递归监视功能是有用的或必要的.