You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含Case命令的Shell脚本翻译及正式技术问询改写需求

批量检查服务器硬盘使用率并执行清理的Shell脚本优化方案

正式技术问询

我需要开发一个Shell脚本,实现以下功能:

  • 批量读取预生产服务器列表文件
  • 远程检查每台服务器上/opt/splunk分区的硬盘使用率百分比
  • 当该分区使用率超过50%时,执行指定的旧文件清理脚本

以下是我编写的初始脚本,希望能得到逻辑验证和优化建议:

#!/bin/bash
clear
echo "可查看硬盘使用率百分比"
for line in $(cat /home/fk60/gerscript/systemlist/pre-prod.txt)
do
usage=$(ssh $line "df -P |grep '/opt/splunk'" | awk '{print $5}' | cut -d'%' -f1)
echo '-------------------------------------------------------------------------' 
echo "机器名称: $( echo $line | cut -d'@' -f2 ) "
case $usage in
50 )
echo "当硬盘使用率超过50%"
echo "处于正常范围"
sudo /home/fk3/scripts/remove_old_da...
# 注:此处原脚本未完成,清理命令路径不完整
esac
done

脚本问题分析与优化建议

作为常年处理服务器批量运维脚本的开发者,我发现你的初始脚本存在几个关键的改进点:

  • 循环读取服务器列表的可靠性问题:
    用for line in $(cat ...)读取文件时,若服务器列表中包含空格或特殊字符,会导致拆分错误。建议改用while read循环,这是处理文件行读取更稳定的方式:

    while IFS= read -r line; do
        # 脚本逻辑
    done < /home/fk60/gerscript/systemlist/pre-prod.txt
    
  • Case语句逻辑不符合需求:
    你需要匹配的是“超过50%”的情况,但当前case $usage in 50 )只会匹配使用率**刚好等于50%**的场景。如果要判断数值范围,用if数值判断会更直观:

    if [[ $usage -gt 50 ]]; then
        echo "硬盘使用率已超过50%,执行清理操作..."
        sudo /home/fk3/scripts/remove_old_data.sh  # 假设完整清理命令路径
    else
        echo "硬盘使用率处于正常范围(≤50%)"
    fi
    

    如果你坚持用case,可以用字符串匹配覆盖数值范围:

    case $usage in
        5[1-9]|6[0-9]|7[0-9]|8[0-9]|9[0-9]|100 )
            echo "硬盘使用率已超过50%,执行清理操作..."
            sudo /home/fk3/scripts/remove_old_data.sh
            ;;
        *)
            echo "硬盘使用率处于正常范围(≤50%)"
            ;;
    esac
    
  • SSH远程执行的权限问题:
    脚本中使用sudo执行清理命令,需要确保远程服务器的SSH免密登录已配置,且当前用户拥有执行该清理脚本的sudo权限(无需输入密码),否则脚本会卡在密码输入环节。可以在远程服务器的sudoers文件中添加对应的NOPASSWD规则。

  • 命令完整性与容错处理:
    初始脚本中的清理命令/home/fk3/scripts/remove_old_da...不完整,需要补充完整路径;另外建议增加容错处理,比如当df命令未找到/opt/splunk分区时,输出错误提示,避免脚本报错终止:

    usage=$(ssh $line "df -P |grep '/opt/splunk'" | awk '{print $5}' | cut -d'%' -f1)
    if [[ -z $usage ]]; then
        echo "警告:未找到/opt/splunk分区"
        continue
    fi
    

优化后的完整脚本

#!/bin/bash
clear
echo "=== 批量检查服务器/opt/splunk分区硬盘使用率 ==="

# 循环读取服务器列表文件
while IFS= read -r line; do
    # 获取机器名称(兼容带@的格式)
    if [[ $line == *@* ]]; then
        hostname=$(echo "$line" | cut -d'@' -f2)
    else
        hostname="$line"
    fi

    echo '-------------------------------------------------------------------------' 
    echo "机器名称: $hostname"

    # 远程获取硬盘使用率
    usage=$(ssh "$line" "df -P | grep '/opt/splunk'" | awk '{print $5}' | cut -d'%' -f1)

    # 容错处理:未找到分区的情况
    if [[ -z $usage ]]; then
        echo "❌ 未检测到/opt/splunk分区"
        continue
    fi

    echo "当前硬盘使用率: ${usage}%"

    # 判断使用率是否超过50%并执行清理
    if [[ $usage -gt 50 ]]; then
        echo "⚠️  使用率超过50%,开始执行旧文件清理..."
        ssh "$line" "sudo /home/fk3/scripts/remove_old_data.sh"
        if [[ $? -eq 0 ]]; then
            echo "✅ 清理操作执行成功"
        else
            echo "❌ 清理操作执行失败"
        fi
    else
        echo "✅ 使用率处于正常范围"
    fi
done < /home/fk60/gerscript/systemlist/pre-prod.txt

echo '-------------------------------------------------------------------------' 
echo "=== 检查完成 ==="

补充说明

  • 确保服务器列表文件pre-prod.txt中的每一行是合法的SSH连接格式(比如user@hostname或直接hostname)
  • 提前配置SSH免密登录,避免每次连接输入密码
  • 测试清理脚本remove_old_data.sh的功能和权限,确保其能正常执行

内容的提问来源于stack exchange,提问作者Gerald Johnson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:04:59