57 lines
1.6 KiB
Bash
Executable File
57 lines
1.6 KiB
Bash
Executable File
#!/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
|