服务器的内存莫名其妙的涨很多,然后服务器就卡死了,现在搞个清理命令。
当服务器内存超过80%时,清空redis缓存。
服务器为:CentOS Stream 9 x86_64(Py3.12.3)
使用的是宝塔面板最新版本
1、服务器安装bc
sudo yum install bc
bc
是一个用于处理浮点数的命令行计算器,在脚本中用于比较内存使用率是否超过阈值
2、判断命令
服务器新建一个sh文件,比如:/www/server/redis/rediscleanall.sh,将下面的命令存放到sh文件中
注意:需要设置sh文件的权限,不然没有执行权限
——————————————-
2025.9.29更新
清理使用异步,不然在清理的同时请求会导致阻塞,同时使用文件锁,防止并发清理
#!/bin/bash
# 异步清理 Redis(不写日志、无前缀清理、带防并发)
set -euo pipefail
# ======= 可配参数 =======
threshold=80.0 # 触发阈值(系统内存使用率%)
redis_host="127.0.0.1"
redis_port="6379"
redis_password="Zz5M4TP2DTHajux"
# 如使用 ACL 用户名,填入:redis_user="default";否则留空
redis_user=""
# 只清当前DB可改:flush_cmd="FLUSHDB ASYNC"
flush_cmd="FLUSHALL ASYNC"
# 锁文件与脚本放在同目录
script_dir="$(cd "$(dirname "$0")" && pwd)"
lock_file="$script_dir/redis_cleaner.lock"
# ========================
# ---------- 防并发 ----------
exec 9>"$lock_file"
if ! flock -n 9; then
echo "已有清理任务在运行,退出。"
exit 0
fi
# (脚本结束时文件描述符自动关闭,锁会释放)
# ---------- 计算系统内存使用率 ----------
memory_usage=$(free | awk '/Mem/{printf "%.2f", $3/$2*100}')
# ---------- redis-cli 检查 ----------
if ! command -v redis-cli >/dev/null 2>&1; then
echo "ERROR: redis-cli 不存在,请先安装。"
exit 1
fi
# ---------- 认证参数(用环境变量,避免 -a 警告) ----------
if [[ -n "$redis_password" ]]; then
export REDISCLI_AUTH="$redis_password"
fi
# 构造 redis-cli 连接参数(TCP)
CLI_ARGS=( -h "$redis_host" -p "$redis_port" )
if [[ -n "$redis_user" ]]; then
CLI_ARGS+=( --user "$redis_user" )
fi
# ---------- 连通性检查 ----------
if ! redis-cli "${CLI_ARGS[@]}" --no-auth-warning -r 1 ping >/dev/null 2>&1; then
echo "ERROR: 无法连接到 Redis ($redis_host:$redis_port),取消清理。"
exit 1
fi
echo "当前系统内存使用率:$memory_usage%(阈值:$threshold%)"
# ---------- 阈值判断 + 异步清理 ----------
if (( $(echo "$memory_usage > $threshold" | bc -l) )); then
echo "达到阈值,执行异步清理:$flush_cmd"
if redis-cli "${CLI_ARGS[@]}" --no-auth-warning $flush_cmd; then
echo "已触发:$flush_cmd(异步),不会阻塞 Redis。"
else
echo "ERROR: 执行 $flush_cmd 失败。"
exit 1
fi
else
echo "内存使用率正常,无需清理。"
fi
——————————————-
#!/bin/bash
# 获取当前内存使用率
memory_usage=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
# 设置内存使用阈值
threshold=80.0
# 输出当前内存使用率
echo "当前内存使用率: $memory_usage%"
# 检查内存使用率是否超过阈值
if (( $(echo "$memory_usage > $threshold" | bc -l) )); then
echo "内存使用率超过80%,正在清空Redis缓存..."
# 清空Redis缓存
redis-cli flushall
else
echo "内存使用率正常,未达到清空Redis缓存的条件。"
fi
如果你的 Redis 设置了密码,你需要在清空 Redis 缓存时提供密码。可以通过 redis-cli
的 -a
选项来传递密码。修改脚本如下:
#!/bin/bash
# 获取当前内存使用率
memory_usage=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
# 设置内存使用阈值
threshold=80.0
# Redis 密码
redis_password="your_redis_password"
# 输出当前内存使用率
echo "当前内存使用率: $memory_usage%"
# 检查内存使用率是否超过阈值
if (( $(echo "$memory_usage > $threshold" | bc -l) )); then
echo "内存使用率超过80%,正在清空Redis缓存..."
# 使用密码清空Redis缓存
redis-cli -a $redis_password flushall
else
echo "内存使用率正常,未达到清空Redis缓存的条件。"
fi
但是直接这样使用密码执行,会提示不安全:
Warning: Using a password with ‘-a’ or ‘-u’ option on the command line interface may not be safe.
下面是优化的代码
#!/bin/bash
# 获取当前内存使用率
memory_usage=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
# 设置内存使用阈值
threshold=80.0
# Redis 密码
redis_password="your_redis_password"
# 输出当前内存使用率
echo "当前内存使用率: $memory_usage%"
# 设置 REDISCLI_AUTH 环境变量
export REDISCLI_AUTH=$redis_password
# 检查内存使用率是否超过阈值
if (( $(echo "$memory_usage > $threshold" | bc -l) )); then
echo "内存使用率超过80%,正在清空Redis缓存..."
# 清空Redis缓存
redis-cli flushall
else
echo "内存使用率正常,未达到清空Redis缓存的条件。"
fi
3、在宝塔面板设置定时任务
在宝塔面板设置定时任务,比如设置为每隔3分钟检测一次

4、最终测试
经过测试,能够正常的识别当前内存使用率,并且内存超过80%后,执行清理redis缓存。
到此为止。
发布者:彬彬笔记,转载请注明出处:https://www.binbinbiji.com/linux/3588.html