宝塔监测CPU IO的shell代码
:本站 2025-11-28 17:01:37 :15

无docker版本
#!/bin/bash
# 阈值配置(生产环境建议调整)
IO_THRESHOLD=70 # iowait百分比阈值(正常服务器通常<30%)
CPU_THRESHOLD=70 # CPU总使用率阈值(用户+系统)
MEMORY_THRESHOLD=70 # 内存使用率阈值
# 获取精确系统指标
get_system_stats() {
# 从/proc/stat获取iowait数据(单位:1/100秒)
local cpu_line=$(grep 'cpu ' /proc/stat)
local total_jiffies=$(echo $cpu_line | awk '{sum=0; for(i=2;i<=8;i++)sum+=$i; print sum}')
local iowait_jiffies=$(echo $cpu_line | awk '{print $6}')
io_wait=$(awk "BEGIN {printf \"%.1f\", ($iowait_jiffies / $total_jiffies) * 100}")
# 计算CPU使用率(基于/proc/loadavg)
local cpu_cores=$(nproc)
cpu_usage=$(awk -v cores="$cpu_cores" '{printf "%.1f", ($1 / cores) * 100}' /proc/loadavg)
# 内存使用率计算(兼容不同free版本)
memory_usage=$(free -b | awk '/Mem/ {printf "%.1f", $3/$2 * 100}')
}
# 系统状态反馈函数
report_status() {
local status_msg="当前状态: IO=${io_wait}% CPU=${cpu_usage}% MEM=${memory_usage}%"
echo "$(date "+%Y-%m-%d %H:%M:%S") - ${status_msg}"
}
# 重启判断逻辑
check_and_restart() {
# 使用awk进行浮点数比较,避免依赖bc
local trigger_io=$(awk -v io="$io_wait" -v th="$IO_THRESHOLD" 'BEGIN {print (io > th) ? 1 : 0}')
local trigger_cpu=$(awk -v cpu="$cpu_usage" -v th="$CPU_THRESHOLD" 'BEGIN {print (cpu > th) ? 1 : 0}')
local trigger_mem=$(awk -v mem="$memory_usage" -v th="$MEMORY_THRESHOLD" 'BEGIN {print (mem > th) ? 1 : 0}')
# 触发重启条件时的处理
if [ "$trigger_io" -eq 1 ] || [ "$trigger_cpu" -eq 1 ] || [ "$trigger_mem" -eq 1 ]; then
echo "$(date "+%Y-%m-%d %H:%M:%S") - 触发重启: IO=${io_wait}% CPU=${cpu_usage}% MEM=${memory_usage}%"
if systemctl restart mysql; then
echo "My**L重启成功"
exit 0
else
echo "My**L重启失败! 错误码:$?" >&2
exit 1
fi
else
# 未触发条件时输出状态
report_status
fi
}
# 主执行流程
get_system_stats
check_and_restart
# 最终状态确认(防止意外静默退出)
report_status
exit 0
系统mysql+docker mysql
#!/bin/bash
# 阈值配置
IO_THRESHOLD=70
CPU_THRESHOLD=70
MEMORY_THRESHOLD=70
# My**L服务标识
MY**L_SERVICE=""
CONTAINER_NAME="mysql_eazm-mysql_eazM-1" # 修改为您的实际容器名称
# 检测My**L运行环境
detect_mysql_environment() {
# 检查Docker中的My**L
if docker ps --format "table {{.Names}}" | grep -q "$CONTAINER_NAME"; then
if docker exec "$CONTAINER_NAME" which mysql >/dev/null 2>&1; then
MY**L_SERVICE="docker"
echo "检测到My**L运行在Docker容器: $CONTAINER_NAME"
return 0
fi
fi
# 检查宿主机系统服务
if systemctl is-active mysql >/dev/null 2>&1 ||
systemctl is-active mysqld >/dev/null 2>&1; then
MY**L_SERVICE="systemd"
echo "检测到My**L运行在宿主机系统服务"
return 0
fi
# 检查宝塔面板服务
if [ -f "/etc/init.d/bt" ] && /etc/init.d/bt status >/dev/null 2>&1 &&
[ -f "/etc/init.d/mysqld" ] && /etc/init.d/mysqld status >/dev/null 2>&1; then
MY**L_SERVICE="bt"
echo "检测到My**L运行在宝塔面板管理下"
return 0
fi
echo "错误: 未检测到运行的My**L服务" >&2
return 1
}
# 重启My**L服务
restart_mysql() {
case "$MY**L_SERVICE" in
"docker")
echo "重启Docker容器中的My**L..."
echo "容器名称: $CONTAINER_NAME"
if docker restart "$CONTAINER_NAME"; then
echo "Docker My**L重启成功"
return 0
else
echo "Docker My**L重启失败! 错误码:$?" >&2
return 1
fi
;;
"systemd")
echo "重启系统服务My**L..."
# 尝试不同的服务名
if systemctl restart mysql 2>/dev/null; then
echo "系统服务mysql重启成功"
return 0
elif systemctl restart mysqld 2>/dev/null; then
echo "系统服务mysqld重启成功"
return 0
else
echo "系统服务My**L重启失败! 错误码:$?" >&2
return 1
fi
;;
"bt")
echo "重启宝塔My**L服务..."
if /etc/init.d/mysqld restart; then
echo "宝塔My**L重启成功"
return 0
else
echo "宝塔My**L重启失败! 错误码:$?" >&2
return 1
fi
;;
*)
echo "未知的My**L服务类型" >&2
return 1
;;
esac
}
# 获取系统指标
get_system_stats() {
# 从/proc/stat获取iowait数据
local cpu_line=$(grep 'cpu ' /proc/stat)
local total_jiffies=$(echo $cpu_line | awk '{sum=0; for(i=2;i<=8;i++)sum+=$i; print sum}')
local iowait_jiffies=$(echo $cpu_line | awk '{print $6}')
if [ "$total_jiffies" -eq 0 ]; then
io_wait=0
else
io_wait=$(awk "BEGIN {printf \"%.1f\", ($iowait_jiffies / $total_jiffies) * 100}")
fi
# 计算CPU使用率(基于/proc/loadavg)
local cpu_cores=$(nproc)
cpu_usage=$(awk -v cores="$cpu_cores" 'BEGIN {load = getline < "/proc/loadavg" ? $1 : 0; printf "%.1f", (load / cores) * 100}')
# 内存使用率计算
memory_usage=$(free -b | awk '/Mem/ {used=$3; total=$2; if(total>0) printf "%.1f", used/total*100; else printf "0"}')
}
# 系统状态反馈函数
report_status() {
local status_msg="当前状态: IO=${io_wait}% CPU=${cpu_usage}% MEM=${memory_usage}%"
echo "$(date "+%Y-%m-%d %H:%M:%S") - ${status_msg}"
}
# 重启判断逻辑
check_and_restart() {
# 使用awk进行浮点数比较
local trigger_io=$(awk -v io="$io_wait" -v th="$IO_THRESHOLD" 'BEGIN {if (io > th) print 1; else print 0}')
local trigger_cpu=$(awk -v cpu="$cpu_usage" -v th="$CPU_THRESHOLD" 'BEGIN {if (cpu > th) print 1; else print 0}')
local trigger_mem=$(awk -v mem="$memory_usage" -v th="$MEMORY_THRESHOLD" 'BEGIN {if (mem > th) print 1; else print 0}')
if [ "$trigger_io" -eq 1 ] || [ "$trigger_cpu" -eq 1 ] || [ "$trigger_mem" -eq 1 ]; then
echo "$(date "+%Y-%m-%d %H:%M:%S") - 触发重启: IO=${io_wait}% CPU=${cpu_usage}% MEM=${memory_usage}%"
if restart_mysql; then
exit 0
else
exit 1
fi
else
report_status
fi
}
# 主执行流程
main() {
if ! detect_mysql_environment; then
echo "$(date "+%Y-%m-%d %H:%M:%S") - 错误: 无法确定My**L运行环境" >&2
exit 1
fi
get_system_stats
check_and_restart
report_status
}
# 执行主函数
main
exit 0验证容器名称是否正确:
您也可以先验证一下容器名称:
# 查看所有运行的容器
docker ps
# 查看特定容器信息
docker inspect mysql_eazm-mysql_eazM-1
# 测试容器内的My**L
docker exec mysql_eazm-mysql_eazM-1 mysql --version如果容器名称包含特殊字符的注意事项:
如果容器名称包含连字符或其他特殊字符,可能需要确保:
- 名称完全匹配(包括大小写)
- 如果名称包含空格或特殊字符,可能需要用引号括起来
现在脚本应该能正确识别并重启您的宝塔Docker中的My**L容器了。
本文编辑:admin
:
更多文章:
现代网站favicon应该有哪些尺寸,favicon.ico需要多种尺寸来适配不同设备和平台
2026年4月2日 10:47
sitemap无静态时怎么防止恶意访问,sitemap防御方法
2026年3月9日 16:01
linux终端查看Nginx日志文件指定关键词,Nginx日志查找蜘蛛
2025年10月11日 16:37
宝塔Nginx屏蔽UA,屏蔽Referer方法,宝塔NG补充免费防火墙方法
2025年9月21日 21:29
宝塔服务器部署Django提示mysqlclient未安装 ,宝塔libmariadb安装教程
2025年5月21日 22:10



















