Refine backup script
This commit is contained in:
54
check_nas_dir.sh
Executable file
54
check_nas_dir.sh
Executable file
@@ -0,0 +1,54 @@
|
||||
#!/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
|
||||
# 狀態正常
|
||||
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
|
||||
Reference in New Issue
Block a user