针对你的需求(Java进程内存超过阈值自动重启),我为你准备了两个方案。一个是轻量级 Shell 脚本(简单直接),另一个是使用专业监控工具 Monit(功能更强大,推荐长期使用)。
方案一:轻量级 Shell 脚本 (推荐新手)
这个脚本会每 60 秒检查一次 Java 进程的内存使用情况,如果超过你设定的阈值(例如 4GB),就会自动重启它。
1. 创建脚本文件
在你的服务器上(例如在 jar 包同级目录),创建一个名为 monitor.sh 的文件:
#!/bin/bash
# ================= 配置区 =================
# 你的 Jar 包名称(必须准确)
JAR_NAME="ai_media_java.jar"
# 内存阈值(单位:MB)。例如 4096 代表 4GB。如果 Java 内存超过这个值,就会重启。
MEMORY_THRESHOLD=4096
# 检查间隔(单位:秒)
CHECK_INTERVAL=60
# 启动命令参数(除了 -jar 那部分)
START_PARAMS="--spring.profiles.active=test"
# ==========================================
# 日志文件路径
LOG_FILE="./monitor.log"
# Java 路径(使用你指定的绝对路径)
JAVA_PATH="/mnt/data/jdk-21.0.9/bin/java"
echo "监控脚本启动,时间: $ (date)" >> " $ LOG_FILE"
while true; do
# 1. 尝试获取 Java 进程的 PID
# 注意:这里通过 Jar 名称匹配,避免匹配到 grep 自身
PID= $ (ps aux | grep " $ JAR_NAME" | grep -v "grep" | grep -v "monitor.sh" | awk '{print $ 2}' | head -n 1)
if [ -z " $ PID" ]; then
echo "[ $ (date)] 进程未运行,正在启动..." >> " $ LOG_FILE"
# 启动应用(后台运行,输出重定向到日志)
nohup $ JAVA_PATH -jar $ JAR_NAME $ START_PARAMS >> app.log 2>&1 &
sleep 10 # 等待 10 秒让应用启动
continue
fi
# 2. 获取该进程的内存使用量 (单位: MB)
# RSS 是实际使用的物理内存
RSS= $ (ps -p $ PID -o rss= 2>/dev/null)
if [ -z " $ RSS" ]; then
echo "[ $ (date)] 无法获取内存数据,进程可能已退出,尝试重启..." >> " $ LOG_FILE"
kill -9 $ PID 2>/dev/null
nohup $ JAVA_PATH -jar $ JAR_NAME $ START_PARAMS >> app.log 2>&1 &
sleep 10
continue
fi
# 将 KB 转换为 MB (ps rss 默认是 KB)
MEM_MB= $ ((RSS / 1024))
echo "[ $ (date)] PID: $ PID | 内存使用: $ {MEM_MB}MB | 阈值: $ {MEMORY_THRESHOLD}MB" >> " $ LOG_FILE"
# 3. 判断是否超过阈值
if [ $ MEM_MB -gt $ MEMORY_THRESHOLD ]; then
echo "[ $ (date)] 警告: 内存使用 $ {MEM_MB}MB 超过阈值 $ {MEMORY_THRESHOLD}MB,正在重启..." >> " $ LOG_FILE"
# 先尝试优雅关闭(如果应用不响应,再强制 kill)
kill $ PID 2>/dev/null
sleep 5
# 检查是否还在运行,如果在就强制 kill
if ps -p $ PID > /dev/null; then
kill -9 $ PID 2>/dev/null
echo "[ $ (date)] 强制终止进程 $ PID" >> " $ LOG_FILE"
fi
# 重启应用
nohup $ JAVA_PATH -jar $ JAR_NAME $ START_PARAMS >> app.log 2>&1 &
sleep 10 # 等待新进程启动
fi
sleep $ CHECK_INTERVAL
done
2. 修改配置
打开 monitor.sh,修改顶部的配置:
JAR_NAME: 改成你的 ai_media_java.jar。
MEMORY_THRESHOLD: 改成你希望的数值(单位 MB)。比如你的服务器有 8G 内存,留点余量给系统,可以设为 6144 (6G) 或 7168 (7G)。
3. 启动脚本
给脚本添加执行权限并后台运行:
# 添加执行权限
chmod +x monitor.sh
# 后台启动监控脚本 (关闭终端也不会停止)
nohup ./monitor.sh > monitor_out.log 2>&1 &
欢迎来撩 : 汇总all
