温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java Tomcat如何实现自动重启

发布时间:2025-12-21 21:06:32 来源:亿速云 阅读:145 作者:小樊 栏目:编程语言

Java Tomcat自动重启实现指南

一 系统级守护与自恢复

  • 使用 systemd 将 Tomcat 注册为系统服务,配置 Restart=always 可在进程异常退出时自动拉起,适合生产环境长期稳定运行。
  • 示例服务文件(/etc/systemd/system/tomcat9.service):
[Unit]
Description=Apache Tomcat Web Application Container
After=network.target

[Service]
Type=forking
Environment=JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
Environment=CATALINA_PID=/opt/tomcat9/temp/tomcat.pid
Environment=CATALINA_HOME=/opt/tomcat9
Environment=CATALINA_BASE=/opt/tomcat9
Environment='CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC'
Environment='JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom'
ExecStart=/opt/tomcat9/bin/startup.sh
ExecStop=/opt/tomcat9/bin/shutdown.sh
User=tomcat
Group=tomcat
UMask=0007
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
  • 生效与验证:
    • 重载配置:sudo systemctl daemon-reload
    • 启动与开机自启:sudo systemctl start tomcat9 && sudo systemctl enable tomcat9
    • 查看状态与日志:systemctl status tomcat9journalctl -u tomcat9
  • 说明:也可按需改为 Restart=on-failureRestart=on-abort 以区分重启策略。

二 定时重启

  • 适用场景:需要按天/周在固定时间重启以释放资源或应用更新后定时生效。
  • Linux 使用 crontab 调用重启脚本(示例每天 03:10 重启):
    • 脚本示例(/opt/scripts/restart_tomcat.sh):
#!/bin/bash
source /etc/profile
export JAVA_HOME=/usr/local/jdk
export JRE_HOME=$JAVA_HOME/jre
TOMCAT_HOME=/opt/tomcat
LOGFILE=/opt/log/restart_tomcat.log

echo "[$(date '+%F %T')] 停止 Tomcat ..." >> $LOGFILE
$TOMCAT_HOME/bin/shutdown.sh >> $LOGFILE 2>&1
sleep 5
# 兜底强杀残留进程
PID=$(ps -ef | grep java | grep catalina | awk '{print $2}')
if [ -n "$PID" ]; then
  kill -9 $PID && echo "[$(date '+%F %T')] 已 kill 进程 $PID" >> $LOGFILE
fi
sleep 2
echo "[$(date '+%F %T')] 启动 Tomcat ..." >> $LOGFILE
$TOMCAT_HOME/bin/startup.sh >> $LOGFILE 2>&1
  • 赋权与定时任务:
    • chmod +x /opt/scripts/restart_tomcat.sh
    • crontab -e 添加:10 3 * * * /opt/scripts/restart_tomcat.sh
  • Windows 可使用“任务计划程序”定时执行 net stop/start Tomcat9 或调用批处理脚本。

三 应用内或外部监控自愈

  • 思路:用 Java 或脚本定期探测 HTTP 心跳,若失败再检查进程是否存在,必要时执行 stop/start 脚本实现自愈。
  • Java 探测与重启示例(简化版):
public class TomcatWatchdog {
  private static final String HEARTBEAT_URL = "http://localhost:8080/heartbeat.htm";
  private static final int CONNECT_TIMEOUT = 1000;
  private static final int READ_TIMEOUT = 4000;
  private static final String TOMCAT_HOME = "/opt/tomcat";

  public static void main(String[] args) throws Exception {
    if (!isAlive(HEARTBEAT_URL)) {
      System.out.println(new Date() + " 心跳失败,检查进程并准备重启");
      if (isProcessAlive("catalina")) {
        System.out.println(new Date() + " 进程仍在,先尝试关闭");
        exec(TOMCAT_HOME + "/bin/shutdown.sh");
        Thread.sleep(5000);
        if (isProcessAlive("catalina")) {
          System.out.println(new Date() + " 关闭失败,执行 kill -9");
          exec("kill -9 $(ps -ef | grep java | grep catalina | awk '{print $2}')");
          Thread.sleep(2000);
        }
      }
      System.out.println(new Date() + " 启动 Tomcat");
      exec(TOMCAT_HOME + "/bin/startup.sh");
    }
  }
  private static boolean isAlive(String url) {
    try {
      URL u = new URL(url);
      URLConnection c = u.openConnection();
      c.setConnectTimeout(CONNECT_TIMEOUT);
      c.setReadTimeout(READ_TIMEOUT);
      try (BufferedReader in = new BufferedReader(new InputStreamReader(c.getInputStream()))) {
        while (in.readLine() != null) { }
      }
      return true;
    } catch (Exception e) { return false; }
  }
  private static boolean isProcessAlive(String keyword) throws Exception {
    Process p = Runtime.getRuntime().exec("ps -ef | grep java | grep " + keyword);
    try (BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()))) {
      return r.lines().anyMatch(l -> l.contains(keyword));
    }
  }
  private static void exec(String cmd) throws Exception {
    Process p = Runtime.getRuntime().exec(cmd);
    try (BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()))) {
      r.lines().forEach(System.out::println);
    }
  }
}
  • 建议:将探测逻辑放入 定时任务(如 Spring @ScheduledQuartz),并增加日志、告警与最大重试次数,避免频繁抖动重启。

四 运维与部署常用方式

  • 管理控制台:配置并登录 Manager App,在页面执行重启,适合临时维护(需配置 $CATALINA_HOME/conf/tomcat-users.xmlmanager-gui 角色)。
  • 脚本自动化:在 Linux 用 systemctl/service 或 Shell 脚本,在 Windows 用批处理调用 net stop/start Tomcat9,便于在 CI/CD(如 JenkinsGitLab CI)中编排部署后重启。

五 关键注意事项

  • 优先选择 systemd 守护(最稳妥、系统级监控与日志集成完善);定时重启适合维护窗口;应用内自愈需控制重启频率与阈值,避免“重启风暴”。
  • 重启前确保优雅关闭:先执行 shutdown.sh,等待数秒后再 kill -9 兜底;重启后及时检查 catalina.outjournalctl 日志定位问题。
  • 权限与安全:以 非 root 用户运行 Tomcat;脚本与密钥文件设置最小权限;对外网暴露的 Manager App 需限制来源并加固账号。
  • 监控与告警:为“连续失败次数、重启失败、启动超时”配置 告警(如邮件/企业微信/钉钉),并保留完整日志以便回溯。
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI