Unix下检测S3文件夹更新并执行命令的文件监控脚本实现咨询
Unix环境S3文件夹更新监控脚本实现方案
前置依赖准备
你需要先完成以下环境配置:
- 安装AWS CLI v2,可执行
aws --version验证安装是否成功 - 配置AWS访问凭证,可通过
aws configure设置Access Key/Secret Key,或给运行脚本的实例绑定对应IAM角色,需至少授予s3:ListBucket权限 - 确认目标S3路径格式为
s3://<桶名>/<文件夹前缀>/,末尾斜杠代表监控该文件夹下的所有内容
核心脚本代码
#!/bin/bash # 自定义配置项,根据实际场景修改 S3_MONITOR_PATH="s3://your-bucket/target-folder/" CHECK_INTERVAL=30 # 两次检查的间隔时间,单位:秒 CUSTOM_EXEC_CMD="your-predefined-command" # 检测到更新后要执行的Unix命令 STATE_SAVE_PATH="/tmp/s3_monitor_last_check_state" # 首次运行初始化状态文件 if [ ! -f "${STATE_SAVE_PATH}" ]; then aws s3 ls --recursive "${S3_MONITOR_PATH}" | sha256sum | awk '{print $1}' > "${STATE_SAVE_PATH}" fi # 循环检测逻辑 while true do # 生成当前S3路径的状态哈希(包含文件列表、大小、修改时间,任意项变化都会导致哈希变更) CURRENT_STATE=$(aws s3 ls --recursive "${S3_MONITOR_PATH}" | sha256sum | awk '{print $1}') LAST_STATE=$(cat "${STATE_SAVE_PATH}") # 状态对比,不一致则触发自定义命令 if [ "${CURRENT_STATE}" != "${LAST_STATE}" ]; then echo "[$(date '+%Y-%m-%d %H:%M:%S')] 检测到S3路径更新,执行预设命令" eval ${CUSTOM_EXEC_CMD} # 更新状态文件 echo "${CURRENT_STATE}" > "${STATE_SAVE_PATH}" fi sleep ${CHECK_INTERVAL} done
脚本使用步骤
- 将上述代码保存为
s3_monitor.sh,执行chmod +x s3_monitor.sh赋予可执行权限 - 修改脚本开头的自定义配置项,替换为你实际的S3路径、检查间隔、要执行的命令
- 前台测试运行:执行
./s3_monitor.sh,手动上传/修改/删除S3目标路径下的文件,确认可以正常触发预设命令 - 后台常驻运行:执行
nohup ./s3_monitor.sh > /var/log/s3_monitor.log 2>&1 &,运行日志会统一写入/var/log/s3_monitor.log方便排查问题
可选优化方案
- 如果监控的S3路径下文件数量极多,可改用
aws s3api list-objects-v2接口仅拉取最新的文件修改时间,降低接口请求开销 - 如需开机自启动,可将脚本注册为systemd服务,或添加到
/etc/rc.local中 - 可自行添加通知逻辑,在命令执行成功或失败时发送邮件、企业微信/钉钉告警
- 如需仅监控特定格式的文件,可在
aws s3 ls --recursive命令后添加grep "\.csv$"之类的过滤规则,匹配你需要监控的文件后缀
内容的提问来源于stack exchange,提问作者Mihir Garg
相关产品推荐
相关产品推荐

