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服務化),能進一步滿足復雜運維需求。