首页主机资讯CentOS Java如何进行故障恢复

CentOS Java如何进行故障恢复

时间2025-12-17 19:40:03发布访客分类主机资讯浏览777
导读:CentOS Java故障恢复实操手册 一 快速恢复步骤 确认状态与定位进程 查看Java进程:ps -ef | grep java、jps -l 查看资源与端口:top/htop、netstat -tulpen | grep 端口 或...

CentOS Java故障恢复实操手册

一 快速恢复步骤

  • 确认状态与定位进程
    • 查看Java进程:ps -ef | grep javajps -l
    • 查看资源与端口:top/htopnetstat -tulpen | grep 端口ss -ltnp | grep 端口
  • 安全停止与启动
    • 优雅停止优先:kill -15 ;必要时再 kill -9
    • 直接启动:java -jar /path/app.jar
    • 建议使用服务管理:systemctl restart myapp 或脚本化启停
  • 无法启动时优先排查
    • 环境变量:echo $JAVA_HOME;版本:java -version
    • 应用日志:如 catalina.outapplication.log
    • 端口冲突、依赖JAR、配置文件、系统资源(CPU/内存/磁盘)

二 稳定运行与自动恢复

  • 使用 Systemd 托管(推荐)
    • 创建服务文件:/etc/systemd/system/myapp.service
    • 关键配置示例:
      • Restart=on-failureRestartSec=5SuccessExitStatus=143
      • ExecStart=/usr/bin/java -jar /opt/app/app.jar
    • 常用命令:
      • 重载与启停:systemctl daemon-reloadsystemctl start|stop|restart|status myapp
      • 开机自启:systemctl enable myapp
  • 进程监控与自愈脚本
    • 简单自愈脚本思路:检测进程是否存在,不存在则启动并记录日志;可配合 cron 定时巡检
  • 第三方进程管理
    • Supervisor:配置 autostart=true、autorestart=true,统一托管与日志轮转

三 常见故障定位与修复

  • 内存与GC问题
    • 观察GC与健康:jstat -gcutil
    • 堆转储与分析:发生 OutOfMemoryError 时生成 Heap Dump,用 Eclipse MAT 分析泄漏
    • 启动参数建议:设置 -Xms/-Xmx、选择合适的 GC(如 G1),并开启 GC 日志
  • CPU飙高与线程问题
    • 定位线程:top -Hp 找高占用线程ID
    • 抓取栈:jstack > stack.log,将线程ID转16进制后在栈中检索
  • 端口冲突
    • 检查占用:netstat -tulpen | grep 端口ss -ltnp | grep 端口
    • 处理:释放占用进程或修改应用端口配置
  • “无法创建Java虚拟机”
    • 可能原因:内存不足、-Xms/-Xmx 配置不当、Java版本不兼容
    • 处理:free -m 检查内存;调整堆参数;确认 java -version 与应用兼容;必要时设置 JAVA_HOME/PATH
  • 系统层被OOM Killer终止
    • 检查系统日志:grep -i ‘killed process’ /var/log/messagesjournalctl
    • 处理:降低应用内存、优化JVM、扩容内存或配置合理的OOM策略

四 日志与现场保留

  • JVM致命错误日志
    • 崩溃时生成 hs_err_pid.log,位于工作目录或 -XX:ErrorFile= 指定路径
    • 关注头部异常(如 EXCEPTION_ACCESS_VIOLATIONSIGSEGV)、Problematic frame、线程与寄存器信息
  • GC与运行日志
    • 开启 GC 详细日志与时间戳-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/path/gc-$(date +%s).log
  • OOM与堆转储
    • 发生OOM时自动转储并退出:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/dump-$(date +%s).hprof
  • 应用日志
    • 按应用约定查看:如 catalina.out(Tomcat)、application.log(Spring Boot)

五 一键恢复脚本模板

#!/usr/bin/env bash
set -euo pipefail

APP_JAR="/opt/app/app.jar"
LOG_DIR="/var/log/myapp"
PID_FILE="/var/run/myapp.pid"
JAVA="/usr/bin/java"

mkdir -p "$LOG_DIR"

start() {
    
  if [ -f "$PID_FILE" ] &
    &
     kill -0 "$(cat "$PID_FILE")" >
    /dev/null 2>
    &
    1;
     then
    echo "Already running (PID=$(cat $PID_FILE))"
    return 0
  fi
  nohup "$JAVA" -jar "$APP_JAR" >
    >
     "$LOG_DIR/run.log" 2>
    &
    1 &
    
  echo $! >
 "$PID_FILE"
  echo "Started (PID=$!)"
}


stop() {
    
  if [ -f "$PID_FILE" ];
 then
    PID=$(cat "$PID_FILE")
    kill -15 "$PID" || true
    for i in {
1..10}
    ;
     do
      kill -0 "$PID" >
    /dev/null 2>
    &
1 || {
     rm -f "$PID_FILE";
     echo "Stopped";
     return 0;
 }

      sleep 1
    done
    kill -9 "$PID" || true
    rm -f "$PID_FILE"
    echo "Force stopped"
  else
    echo "Not running"
  fi
}


restart() {
     stop;
     start;
 }


case "${
1:-}
    " in
  start|stop|restart) "$1" ;
    ;

  *) echo "Usage: $0 {
start|stop|restart}
    " ;
    ;
    
esac
  • 建议配合 systemdSupervisor 使用,以获得更完善的进程监控与自动重启能力。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: CentOS Java如何进行故障恢复
本文地址: https://pptw.com/jishu/774251.html
centos如何安全配置vsftp CentOS上GCC多线程支持如何开启

游客 回复需填写必要信息