含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.txtCase语句逻辑不符合需求:
你需要匹配的是“超过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%)" ;; esacSSH远程执行的权限问题:
脚本中使用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
相关产品推荐
相关产品推荐

