inotify是Linux内核提供的文件系统事件监控机制,能实时感知文件/目录的创建、修改、删除等操作,相比轮询方式更高效,是Ubuntu自动化运维的重要工具。本文结合实际场景,介绍其在自动化运维中的具体实践。
inotify-tools是用户态工具包,包含inotifywait(监控事件)和inotifywatch(统计事件)两个核心命令,是实现监控的基础。在Ubuntu中安装步骤如下:
sudo apt update
sudo apt install inotify-tools
安装完成后,可通过inotifywait --help验证是否安装成功。
当需要监控某个目录(如网站静态文件目录/var/www/html)的文件变化(创建、修改、删除),并自动同步到备份目录(如/backup/html)时,可使用以下脚本:
#!/bin/bash
SOURCE_DIR="/var/www/html"
BACKUP_DIR="/backup/html"
inotifywait -m -r -e modify,create,delete --format '%w%f' "$SOURCE_DIR" | while read FILE
do
    cp "$FILE" "$BACKUP_DIR"
    echo "$(date): $FILE backed up to $BACKUP_DIR" >> /var/log/inotify_backup.log
done
说明:
-m:持续监控(不退出);-r:递归监控子目录;-e:指定监控事件(modify:内容修改;create:创建;delete:删除);--format:自定义输出格式(%w%f表示完整路径)。backup.sh,赋予执行权限(chmod +x backup.sh)后运行,即可实现实时备份。当应用的配置文件(如Nginx的/etc/nginx/nginx.conf)修改后,需自动重启服务以应用变更,可使用以下脚本:
#!/bin/bash
CONFIG_FILE="/etc/nginx/nginx.conf"
inotifywait -m -e modify "$CONFIG_FILE" | while read path action file
do
    systemctl restart nginx
    echo "$(date): $CONFIG_FILE modified, nginx restarted" >> /var/log/inotify_restart.log
done
说明:
nginx.conf的modify事件(内容修改);systemctl restart nginx命令重启服务;当/var/log/syslog日志文件有新内容追加(modify事件)时,通过桌面通知提醒运维人员:
#!/bin/bash
LOG_FILE="/var/log/syslog"
inotifywait -m -e modify "$LOG_FILE" | while read path action file
do
    notify-send "Log Updated" "$LOG_FILE has new content"
done
说明:
-e modify:监控文件内容修改;notify-send:发送桌面通知(需安装libnotify-bin,通过sudo apt install libnotify-bin安装)。当需要跨服务器同步文件(如将本地/data目录同步到远程服务器192.168.1.100的/backup/data目录),可将inotify与rsync结合,仅同步变化的文件,减少网络传输量:
#!/bin/bash
LOCAL_DIR="/data"
REMOTE_USER="user"
REMOTE_HOST="192.168.1.100"
REMOTE_DIR="/backup/data"
inotifywait -m -r -e modify,create,delete --format '%w%f' "$LOCAL_DIR" | while read FILE
do
    rsync -avz --delete "$LOCAL_DIR" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR"
    echo "$(date): $FILE synced to $REMOTE_HOST:$REMOTE_DIR" >> /var/log/inotify_rsync.log
done
说明:
rsync -avz:归档模式(保留权限、时间戳)、压缩传输、增量同步;--delete:删除远程服务器上本地已删除的文件,保持一致性。若需要长期稳定运行监控任务(如系统级文件监控),可将监控配置为systemd服务,避免脚本因终端关闭而终止:
# /etc/systemd/system/filewatch.path
[Unit]
Description=Watch /etc/important.conf changes
[Path]
PathChanged=/etc/important.conf
[Install]
WantedBy=multi-user.target
# /etc/systemd/system/filewatch.service
[Unit]
Description=Action when /etc/important.conf changes
[Service]
Type=oneshot
ExecStart=/usr/bin/bash -c 'echo "$(date): /etc/important.conf changed" >> /var/log/inotify_systemd.log'
sudo systemctl daemon-reload
sudo systemctl enable --now filewatch.path
优势:
WantedBy=multi-user.target);journalctl -u filewatch.service查看日志)。调整监控限制:
inotify对单个用户的监控数量有限制(默认约8192个),若需要监控大量文件(如百万级小文件),需修改/proc/sys/fs/inotify/max_user_watches文件:
echo 1000000 | sudo tee /proc/sys/fs/inotify/max_user_watches
若需永久生效,可将上述命令添加到/etc/rc.local(开机自动执行)。
避免高频率事件丢失:
inotify在高频率写入场景(如日志文件每秒写入数百次)下,可能合并或遗漏事件。可通过调整监控间隔(如--timeout=1设置1秒超时)或使用缓冲队列(如结合Redis)缓解。
不支持网络文件系统:
inotify仅能监控本地文件系统(如EXT4、XFS),无法监控NFS、Samba等网络文件系统的变化。若需监控网络目录,需在NFS服务器端部署inotify,或使用专门的分布式监控工具(如ZooKeeper)。
通过上述实践,inotify可有效提升Ubuntu自动化运维的效率,覆盖文件备份、服务重启、日志监控等多个场景。结合进阶用法(如rsync同步、systemd服务化),能进一步满足复杂运维需求。