Ubuntu inotify实现自动化运维的完整流程
inotify是Linux内核提供的文件系统事件监控机制,通过inotify-tools工具集(inotifywait、inotifywatch)和脚本/系统服务,可实现文件/目录变化的实时响应,广泛应用于自动化运维场景(如实时备份、配置同步、服务重启等)。以下是具体实现步骤:
在Ubuntu系统中,首先需要安装inotify-tools(包含inotifywait和inotifywatch命令):
sudo apt update
sudo apt install inotify-tools
安装完成后,可通过inotifywait --help验证是否成功。
inotifywait是核心命令,用于等待并报告文件系统事件。以下是一个实时备份脚本示例(监控/path/to/source目录,当文件变化时同步到/path/to/backup):
#!/bin/bash
SOURCE_DIR="/path/to/source" # 监控的源目录
BACKUP_DIR="/path/to/backup" # 备份目标目录
EVENTS="create,modify,delete" # 监控的事件类型(创建、修改、删除)
# 持续监控源目录(-m),递归子目录(-r),指定事件类型(-e)
inotifywait -m -r -e "$EVENTS" --format '%w%f' "$SOURCE_DIR" | while read FILE
do
# 获取文件名(不含路径)
FILENAME=$(basename "$FILE")
# 构建备份路径
BACKUP_PATH="$BACKUP_DIR/$FILENAME"
# 执行备份(覆盖已有文件)
cp "$FILE" "$BACKUP_PATH"
echo "$(date '+%Y-%m-%d %H:%M:%S'): $FILE backed up to $BACKUP_PATH" >> /var/log/inotify_backup.log
done
关键选项说明:
-m:持续监控(不退出);-r:递归监控子目录;-e:指定监控的事件(如modify、create、delete、moved_to等);--format:自定义输出格式(%w%f表示文件完整路径)。若需跨服务器同步,可将inotifywait与rsync结合(示例监控/tmp目录,变化时同步到远程服务器192.168.0.2):
#!/bin/bash
SOURCE_DIR="/tmp"
REMOTE_USER="user"
REMOTE_HOST="192.168.0.2"
REMOTE_DIR="/tmp"
inotifywait -m -r -e modify,create,delete "$SOURCE_DIR" | while read FILE
do
rsync -avz --delete "$SOURCE_DIR/" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/"
echo "$(date '+%Y-%m-%d %H:%M:%S'): Synced $SOURCE_DIR to $REMOTE_HOST:$REMOTE_DIR" >> /var/log/inotify_sync.log
done
说明:rsync -avz实现增量同步(仅传输变化部分),--delete删除目标端多余文件。
若需监控文件权限、所有者等属性变化,可添加attrib事件:
inotifywait -m -e attrib "/path/to/config.conf" | while read path action file; do
echo "$(date): Config file $file attributes changed" >> /var/log/inotify_attrib.log
systemctl restart nginx # 示例:重启Nginx服务使配置生效
done
若需长期稳定运行(如系统级监控),建议使用systemd.path(替代前台脚本),步骤如下:
定义监控路径(示例监控/etc/nginx/nginx.conf):
sudo nano /etc/systemd/system/nginx_config.path
内容如下:
[Unit]
Description=Monitor Nginx config file changes
[Path]
PathModified=/etc/nginx/nginx.conf # 监控的文件路径(支持通配符,如/etc/nginx/*.conf)
Unit=nginx_config.service # 关联的服务单元
[Install]
WantedBy=multi-user.target
定义文件变化后的操作(示例重启Nginx):
sudo nano /etc/systemd/system/nginx_config.service
内容如下:
[Unit]
Description=Restart Nginx when config changes
[Service]
Type=oneshot
ExecStart=/bin/systemctl restart nginx # 执行的操作(如重启服务、执行脚本)
sudo systemctl daemon-reload # 重新加载systemd配置
sudo systemctl enable --now nginx_config.path # 启用并启动监控
验证:修改/etc/nginx/nginx.conf后,systemd会自动调用nginx_config.service重启Nginx。
max_user_watches(每个用户可监控的事件数),默认值通常为8192,可通过以下命令临时修改(永久修改需写入/etc/sysctl.conf):echo 65536 | sudo tee /proc/sys/fs/inotify/max_user_watches
/var/log/inotify_*.log)定期轮转(使用logrotate),避免日志过大。sudo或调整目录权限)。通过以上步骤,可实现Ubuntu系统下基于inotify的自动化运维,覆盖文件同步、服务管理、配置变更等多个场景,提升运维效率。