Linux inotify-tools是一套基于Linux内核inotify机制开发的用户态工具集,主要用于实时监控文件系统的各类事件,比如文件的创建、修改、删除、移动等,无需轮询目录就能及时获取文件变动信息,资源占用极低,非常适合用来实现文件变动触发的自动化任务。

inotify-tools核心介绍
工具组成
inotify-tools主要包含两个常用工具:
- inotifywait:用于等待并监听文件系统事件,支持阻塞式运行,直到捕获到指定事件后输出相关信息,是编写监控脚本的核心工具。
- inotifywatch:用于统计指定时间段内文件系统事件的发生次数,适合做监控数据统计,日常自动化场景中用得较少。
安装方法
主流Linux发行版都可以直接通过包管理器安装:
# CentOS/RHEL系统 yum install -y inotify-tools # Ubuntu/Debian系统 apt-get install -y inotify-tools
用Shell脚本实时触发XML上传的实现步骤
需求场景说明
假设我们需要监控/data/xml_input目录,当有新的XML文件创建完成且写入稳定后,自动将该文件上传到远程服务器的指定目录,上传完成后将本地文件移动到/data/xml_backup目录做备份。
前置准备
首先确保本地已经安装inotify-tools,同时远程服务器已经配置好SSH免密登录,避免上传时需要手动输入密码。如果还没配置免密,可以执行以下命令生成密钥并拷贝到远程服务器:
# 生成ssh密钥,一路回车即可 ssh-keygen -t rsa # 将公钥拷贝到远程服务器,替换remote_user和remote_ip为实际值 ssh-copy-id remote_user@remote_ip
完整Shell脚本实现
以下是完整的监控上传脚本,我们监听目录的创建事件,同时增加文件稳定判断逻辑,避免文件还在写入时就触发上传:
#!/bin/bash
# 监控的目录,XML文件会放到这个目录
WATCH_DIR="/data/xml_input"
# 备份目录,上传成功后移动文件到这里
BACKUP_DIR="/data/xml_backup"
# 远程服务器信息,替换为实际值
REMOTE_USER="remote_user"
REMOTE_IP="remote_ip"
REMOTE_DIR="/data/remote_xml"
# 文件稳定等待时间,单位秒,根据XML文件大小调整
STABLE_WAIT=2
# 确保备份目录存在
mkdir -p ${BACKUP_DIR}
# 启动inotifywait监听,监听创建事件,递归监听子目录,输出事件信息
inotifywait -m -r -e create --format '%w%f' "${WATCH_DIR}" | while read FILE
do
# 只处理.xml后缀的文件
if [[ "${FILE}" == *.xml ]]; then
echo "检测到XML文件: ${FILE}"
# 等待文件写入稳定,循环检查文件大小是否不再变化
FILE_SIZE_OLD=0
FILE_SIZE_NEW=1
while [ ${FILE_SIZE_OLD} -ne ${FILE_SIZE_NEW} ]
do
sleep ${STABLE_WAIT}
FILE_SIZE_OLD=$(stat -c %s "${FILE}" 2>/dev/null)
FILE_SIZE_NEW=$(stat -c %s "${FILE}" 2>/dev/null)
done
echo "文件写入稳定,开始上传: ${FILE}"
# 执行上传操作
scp "${FILE}" "${REMOTE_USER}@${REMOTE_IP}:${REMOTE_DIR}/"
# 判断上传是否成功
if [ $? -eq 0 ]; then
echo "上传成功,开始备份文件: ${FILE}"
mv "${FILE}" "${BACKUP_DIR}/"
echo "备份完成"
else
echo "上传失败,请检查远程服务器连接"
fi
fi
done
脚本运行与后台守护
给脚本添加执行权限后可以直接运行,如果需要后台持续运行,可以结合nohup或者systemd服务:
# 添加执行权限 chmod +x /opt/xml_monitor.sh # 后台运行脚本 nohup /opt/xml_monitor.sh > /var/log/xml_monitor.log 2>&1 &
注意事项
- inotifywait默认有监控文件数量限制,如果监控的目录文件较多,需要调整内核参数
fs.inotify.max_user_watches,执行sysctl -w fs.inotify.max_user_watches=524288可以临时调整,永久调整需要写入/etc/sysctl.conf文件。 - 如果XML文件是其他程序持续写入的,需要根据实际写入速度调整
STABLE_WAIT参数,避免文件未写完就触发上传。 - 生产环境中建议给脚本添加日志切割和异常告警逻辑,方便后续排查问题。
inotify-toolsShell脚本XML上传Linux监控修改时间:2026-07-08 20:03:29