#!/bin/bash # 定義幫助訊息函數 usage() { echo "用法: sudo $0 <掛載路徑> <日誌檔案路徑>" echo "範例: sudo $0 /nas/Backup /var/log/nas_check.log" exit 1 } # 檢查參數數量,如果少於 2 個則顯示 help if [ "$#" -ne 2 ]; then usage fi MOUNT_PATH=$1 LOG_FILE=$2 # 確保 log 檔案的目錄存在 LOG_DIR=$(dirname "$LOG_FILE") if [ ! -d "$LOG_DIR" ]; then mkdir -p "$LOG_DIR" fi # 取得目前時間 TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S") # --- 核心檢查邏輯 --- # 1. 檢查目錄是否為掛載點 # 2. 檢查目錄是否可正常存取 (ls),避免 Stale File Handle 或連線僵死 if mountpoint -q "$MOUNT_PATH" && ls "$MOUNT_PATH" > /dev/null 2>&1; then # 狀態正常 echo "[$TIMESTAMP] 狀態正常。" > "$LOG_FILE" exit 0 else # 狀態異常,開始修復 echo "[$TIMESTAMP] 偵測到 $MOUNT_PATH 掛載異常,準備修復..." >> "$LOG_FILE" # 嘗試強制卸載 (Lazy unmount) # 使用 -l 可以即刻解除目錄占用,解決 "Device or resource busy" umount -l "$MOUNT_PATH" > /dev/null 2>&1 # 重新掛載 (讀取 /etc/fstab 設定) mount "$MOUNT_PATH" >> "$LOG_FILE" 2>&1 # 最終驗證 if mountpoint -q "$MOUNT_PATH" && ls "$MOUNT_PATH" > /dev/null 2>&1; then echo "[$TIMESTAMP] $MOUNT_PATH 修復成功。" >> "$LOG_FILE" # 這裡可以加入重啟 Docker 的通用邏輯 (選用) # systemctl restart docker else echo "[$TIMESTAMP] 錯誤: 無法掛載 $MOUNT_PATH,請檢查網路或 NAS 狀態。" >> "$LOG_FILE" fi fi