【生产实践】Linux中检查挂载点状况的shell脚本

发布于:2025-08-06 ⋅ 阅读:(19) ⋅ 点赞:(0)
  • 最近机房老折腾NAS,动不动服务器上挂的NAS就掉了,业务就跑过来让重挂。
  • 写个脚本每天定时检查以下NAS挂载的情况,如果掉了就给重新挂上
  • NAS掉了以后需要先umount掉再重新挂上
#!/bin/bash
LOG_FILE="/root/mountCheck.log"
MOUNT_POINT="/mnt/nas"
STATUS_FILE="${MOUNT_POINT}/nasStatus.log"

# 获取主机名(去IP化)
get_hostname() {
    hostname  # 仅返回主机名
}

# 带主机名的日志函数
log() {
    local host_info=$(get_hostname)
    local timestamp=$(date "+%Y-%m-%d %H:%M:%S")
    echo "[${timestamp}][${host_info}] $1" | tee -a $LOG_FILE
}

# 双重验证挂载状态
check_nas_mount() {
    # 基础检查:NFS挂载点存在性
    if ! df -Th | grep 'nfs' | grep -qw "$MOUNT_POINT"; then
        log "基础检查失败:未检测到NFS挂载点"
        return 1
    fi

    # 高级验证:状态文件读写测试
    if [[ -f "$STATUS_FILE" ]]; then
        if echo "[$(date '+%Y-%m-%d %H:%M:%S')] 验证写入" >> "$STATUS_FILE" 2>/dev/null; then
            log "状态文件验证成功"
            return 0
        else
            log "状态文件写入失败"
            return 1
        fi
    else
        log "未找到状态文件,尝试创建..."
        echo "NAS状态验证文件" > "$STATUS_FILE" 2>/dev/null || {
            log "状态文件创建失败"
            return 1
        }
        return 0  # 首次创建视为成功
    fi
}

# 强制卸载残留挂载
force_umount() {
    umount -lf "$MOUNT_POINT" 2>/dev/null
    return $?
}

# 挂载恢复流程
mount_retry() {
    mount -a >/dev/null 2>&1
}

# 主流程
main() {
    if check_nas_mount; then
        exit 0
    fi

    for i in {1..3}; do
        log "恢复尝试 $i/3"
        force_umount
        mount_retry
        sleep 3
        
        if check_nas_mount; then
            log "挂载恢复成功"
            exit 0
        fi
    done

    log "严重告警:NAS挂载恢复失败!"
    exit 1
}

main

网站公告

今日签到

点亮在社区的每一天
去签到