文件更改时执行命令


9

我有一种情况,我每天都将.csv文件上传到特定的文件夹/ tmp / data_upload,而旧文件被新文件替换。

数据上传后,我需要运行Python脚本。为此,我有一个想法来创建一个cron作业并监视文件中的更改。我尝试使用inotify,但我对Unix域的了解不多。我怎样才能做到这一点?

一旦上传文件夹中的文件有日期更改,例如/ tmp / data_upload,我就需要执行脚本test.py。


您是否查看过eradman.com/entrproject,自己还没有尝试过,但可能与它有关。
OO

仅供参考,Python有inotify可用的库。例如,请参阅我的答案之一:askubuntu.com/a/939392/295286
Sergiy Kolodyazhnyy

Answers:


10

您可能需要incrond(将cron守护程序化),它将监视文件上的更改,然后执行脚本。

Incrond可以监视添加新文件,修改,删除等等。本文通过一些示例展示了incrond可以监视的事件。

针对您的案例的示例,您可以/etc/incron.d/data_upload使用以下内容创建文件:

/tmp/data_upload IN_CREATE,IN_MODIFY /path/to/test.py 

2
虽然从理论上讲这可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。
杰拉尔德·施耐德

感谢您提醒我,我为链接添加了上下文。
victoroloan

感谢您的回答,只是为了验证安装incrontab shoudl后incrontab -e以root 身份执行的步骤,然后包括此行 /tmp/data_upload IN_CREATE,IN_MODIFY test.py ?以便在我上传新文件后检查它是否应该执行test.py文件?我应该在哪里放置test.py文件?我需要为此提供绝对路径吗?
亚历克斯

1
我认为,最好为脚本添加绝对路径。您也可以检查cron或系统日志,如果脚本似乎不起作用
victoroloan

你还可以记录你指的是你的代码块什么文件,人谁不熟悉Incrond(像我)的语法可能会认为指的是命令,你必须在命令行中执行
Ferrybig



0

我的一般方法是摆弄经典的Unix find实用程序。例如,命令

find /tmp/upload_data/*.csv -mtime -1 -exec /home/myname/test.py

将查找少于一天前已修改的所有.csv文件/tmp/upload_data,并在找到文件后运行您的文件test.py。当然,如果test.py文件位于其他目录中,则需要相应地更新其路径。

如果您cron每天不止一次地运行作业,则可以使用该mmin选项以find分钟为单位指定自修改以来的最长时间。例如,

find /tmp/upload_data/*.csv -mmin -60 -exec /home/myname/test.py

将搜索.csv少于60分钟前修改的文件-如果cron每小时运行一次作业,则很有用。

以下是两个合理的警告:首先,这不会捕获.csv您完全删除的文件。您可能需要单独检查这些内容。其次,我没有时间测试任何一个。期望在我的代码中输入错误,您必须自己调试。


1
-cmd语法是什么?IIRC find需要-exec cmd ;...
D. Ben Knoble

在发布此问题之前,我已经尝试过此操作,但在cron作业的第二个连续第3次连续运行中无法正常工作
Alex

@D。本·诺布尔:你是对的。我将find-internal命令与shell命令混合在一起。固定。感谢您的指正!
托马斯·布兰肯霍恩
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.