答案1
你应该考虑使用inotifywait
, 举个例子:
inotifywait -m /path -e create -e moved_to |
while read dir action file; do
echo "The file '$file' appeared in directory '$dir' via '$action'"
# do something with the file
done
在 Ubuntu 中,inotifywait
由inotify-tools
包裹。
从版本 3.13(当前在 Ubuntu 12.04 中)开始,inotifywait
将包含不带选项的文件名-f
。旧版本可能需要强制。
需要注意的是,-e
选择inotifywait
是进行事件过滤的最佳方式。此外,您的read
命令可以将位置输出分配给多个变量,您可以选择使用或忽略这些变量。无需使用 grep/sed/awk 来预处理输出。
答案2
我只是做了这个,除了在检查之间丢失文件的可能性很小之外,没有发现什么大问题。
while true
do
touch ./lastwatch
sleep 10
find /YOUR/WATCH/PATH -cnewer ./lastwatch -exec SOMECOMMAND {} \;
done
如果您的文件处理时间不太长,您就不应该错过任何新文件。您还可以设置活动的背景...它不是防弹的,但它可以在没有像 inotify 这样的外部工具的情况下达到某些目的。
答案3
我更喜欢incron
,因为它更容易管理。本质上,它是一项利用的服务inotify
,您可以设置配置以根据文件更改操作采取操作。
前任:
<directory> <file change mask> <command or action> options
/var/www/html IN_CREATE /root/scripts/backup.sh
您可以在此处查看完整示例: http://www.cyberciti.biz/faq/linux-inotify-examples-to-replicate-directories/
答案4
如果您想检测新文件,请处理它们,最后删除您可以使用的已处理文件系统路径。该方法基于inotify。有一个选项 DirectoryNotEmpty,因此 systemd 可以在检测到目录中的任何文件时始终运行您的脚本。您必须记住,只有当您可以删除后续文件并且脚本将目录留空时,它才会起作用。
首先准备mymonitor.service文件
[Unit]
Description=Start the script
[Service]
Type=oneshot
ExecStart=/path/to/your/script
接下来转到 mymonitor.path 定义路径
[Unit]
Description= Triggers the service
[Path]
DirectoryNotEmpty=/path/to/monitor
[Install]
WantedBy=multi-user.target
如果 .path 文件的名称与服务的名称相同,则无需在 .path 文件中指定服务名称。
它基于监控文件访问傻瓜式