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的自動化運維,覆蓋文件同步、服務管理、配置變更等多個場景,提升運維效率。