Files
linux_script/check_nas_dir.sh
2026-03-07 12:38:56 +08:00

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