您的位置 首页 java

Java进程内存超过阈值自动重启脚本

针对你的需求(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

白眉大叔

关于白眉大叔linux云计算: 白眉大叔

热门文章