You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何刷新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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 06:22:22