如何刷新inotifywait监控新增目录?或有无更优实时替代方案?
解决方案:即时处理监控摄像头上传的AVI文件
一、动态扩展inotifywait监控(无需重启进程)
核心思路是监控父目录的目录创建事件,一旦新的日期文件夹生成,自动为其添加inotifywait监控;同时先对已存在的目录启动监控,确保历史目录也被覆盖。
示例脚本
#!/bin/bash # 监控的根目录(所有日期文件夹的父目录) ROOT_MONITOR="/var/ftp/camera_uploads" # 函数:启动单个目录的AVI文件监控 start_dir_monitor() { local target_dir="$1" # 持续监控目录下的文件写入完成事件 inotifywait -m -e close_write -r "$target_dir" | while read -r dir action filename; do # 仅处理.avi后缀的文件 if [[ "$filename" =~ \.avi$ ]]; then local full_path="${dir}${filename}" local mp4_path="${full_path%.avi}.mp4" local gif_path="${full_path%.avi}.gif" # 执行转换(根据实际需求调整ffmpeg参数) ffmpeg -i "$full_path" -c:v libx264 -crf 23 -preset medium "$mp4_path" ffmpeg -i "$full_path" -vf "fps=8,scale=480:-1" -loop 0 "$gif_path" fi done & } # 1. 先为已存在的所有子目录启动监控 for existing_dir in "$ROOT_MONITOR"/*/; do if [ -d "$existing_dir" ]; then start_dir_monitor "$existing_dir" fi done # 2. 监控根目录,捕获新目录的创建事件 inotifywait -m -e create -r "$ROOT_MONITOR" | while read -r parent_dir action new_dir; do # 确认是目录而非文件 if [ -d "${parent_dir}${new_dir}" ]; then start_dir_monitor "${parent_dir}${new_dir}" fi done
关键说明
- 使用
-m参数让inotifywait持续监控,&将监控进程放入后台,避免阻塞主脚本 - 监听
close_write事件:确保FTP上传完成后再处理文件,避免读取未写完的AVI - 函数封装监控逻辑,复用性强,新增目录时直接调用即可
二、使用incron(基于inotify的事件触发工具)
incron是系统级的文件事件触发服务,配置更简洁,无需自己写循环逻辑。
步骤1:安装incron
# Debian/Ubuntu apt install incron # RHEL/CentOS yum install incron
步骤2:配置incron规则
编辑用户的incrontab(执行incrontab -e),添加以下规则:
# 递归监控根目录,当有AVI文件写入完成或移动进来时触发转换脚本 /var/ftp/camera_uploads IN_CLOSE_WRITE,IN_MOVED_TO -r /usr/local/bin/convert_avi.sh $@/$#
步骤3:编写转换脚本/usr/local/bin/convert_avi.sh
#!/bin/bash chmod +x "$0" avi_file="$1" # 仅处理AVI文件 if [[ "$avi_file" =~ \.avi$ ]]; then mp4_file="${avi_file%.avi}.mp4" gif_file="${avi_file%.avi}.gif" ffmpeg -i "$avi_file" -c:v libx264 -crf 23 -preset medium "$mp4_file" ffmpeg -i "$avi_file" -vf "fps=8,scale=480:-1" -loop 0 "$gif_file" fi
三、优化定时find方案(备选)
如果暂时不想用inotify类工具,可以优化find命令,只扫描最近1分钟内修改的文件,大幅缩短扫描时间:
find /var/ftp/camera_uploads -type f -name "*.avi" -mmin -1 -exec /usr/local/bin/convert_avi.sh {} \;
将这个命令加入cron,每分钟执行一次,扫描范围仅为最近1分钟的文件,耗时会远低于30秒。
内容的提问来源于stack exchange,提问作者Paulo
相关产品推荐
相关产品推荐

