南京中国转运服务网

Tomcat宕机自动重启和每日定时启动的实现方法

2026-03-27 20:14:02 浏览次数:2
详细信息

Tomcat宕机自动重启和每日定时启动可以通过以下几种方式实现:

一、自动重启方案

1. 使用Shell脚本监控(Linux)

#!/bin/bash
# tomcat_monitor.sh

TOMCAT_HOME=/usr/local/tomcat
CHECK_URL="http://localhost:8080"
CHECK_INTERVAL=60  # 检查间隔(秒)
MAX_RETRIES=3

check_tomcat() {
    # 方法1:检查端口
    # netstat -an | grep :8080 | grep LISTEN > /dev/null

    # 方法2:检查进程
    # ps -ef | grep tomcat | grep -v grep > /dev/null

    # 方法3:发送HTTP请求
    response=$(curl -s -o /dev/null -w "%{http_code}" $CHECK_URL)
    if [ "$response" = "200" ]; then
        return 0
    else
        return 1
    fi
}

restart_tomcat() {
    echo "$(date): Tomcat is down, restarting..." >> /var/log/tomcat_monitor.log

    # 先正常停止
    $TOMCAT_HOME/bin/shutdown.sh
    sleep 10

    # 强制kill残留进程
    pkill -9 -f tomcat

    # 启动Tomcat
    $TOMCAT_HOME/bin/startup.sh
    echo "$(date): Tomcat restarted" >> /var/log/tomcat_monitor.log
}

# 主循环
while true; do
    if ! check_tomcat; then
        restart_tomcat
        sleep 120  # 重启后等待一段时间再检查
    fi
    sleep $CHECK_INTERVAL
done

2. 使用Supervisor进程管理

; /etc/supervisor/conf.d/tomcat.conf
[program:tomcat]
command=/usr/local/tomcat/bin/catalina.sh run
directory=/usr/local/tomcat
user=www
autostart=true
autorestart=true
startsecs=10
startretries=3
redirect_stderr=true
stdout_logfile=/var/log/tomcat/stdout.log
stderr_logfile=/var/log/tomcat/stderr.log

3. 使用Systemd服务(推荐)

; /etc/systemd/system/tomcat.service
[Unit]
Description=Apache Tomcat
After=network.target

[Service]
Type=forking
User=tomcat
Group=tomcat
Environment="JAVA_HOME=/usr/lib/jvm/java-11-openjdk"
Environment="CATALINA_PID=/opt/tomcat/temp/tomcat.pid"
Environment="CATALINA_HOME=/opt/tomcat"
Environment="CATALINA_BASE=/opt/tomcat"
ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh
Restart=on-failure
RestartSec=10
StartLimitInterval=300
StartLimitBurst=5

[Install]
WantedBy=multi-user.target

二、每日定时启动方案

1. 使用Crontab定时任务

# 每日凌晨3点重启Tomcat(强制重启)
0 3 * * * /usr/local/tomcat/bin/shutdown.sh && sleep 10 && pkill -9 -f tomcat && /usr/local/tomcat/bin/startup.sh

# 或者使用systemctl
0 3 * * * systemctl restart tomcat

# 每日凌晨3:30优雅重启(先停止再启动)
30 3 * * * /path/to/graceful_restart.sh

优雅重启脚本示例:

#!/bin/bash
# graceful_restart.sh

TOMCAT_HOME=/usr/local/tomcat
LOG_FILE=/var/log/tomcat_restart.log

echo "$(date): Starting graceful restart..." >> $LOG_FILE

# 检查是否有会话
SESSIONS=$(curl -s http://localhost:8080/manager/text/sessions?path=/ | grep activeSessions || echo "0")
echo "Active sessions: $SESSIONS" >> $LOG_FILE

# 优雅关闭
$TOMCAT_HOME/bin/shutdown.sh
sleep 30

# 如果还有进程,强制kill
if ps -ef | grep tomcat | grep -v grep > /dev/null; then
    echo "Forcing kill..." >> $LOG_FILE
    pkill -9 -f tomcat
    sleep 5
fi

# 启动
$TOMCAT_HOME/bin/startup.sh
echo "$(date): Restart completed" >> $LOG_FILE

2. 使用Ansible(集群环境)

# restart_tomcat.yml
- hosts: tomcat_servers
  serial: 1  # 一台台重启,避免全部宕机
  tasks:
    - name: Check active sessions
      uri:
        url: "http://{{ inventory_hostname }}:8080/manager/text/sessions?path=/"
        user: admin
        password: "{{ tomcat_password }}"
      register: sessions
      ignore_errors: yes

    - name: Display session count
      debug:
        msg: "Active sessions on {{ inventory_hostname }}: {{ sessions.stdout }}"

    - name: Stop Tomcat gracefully
      shell: |
        /usr/local/tomcat/bin/shutdown.sh
        sleep 30
      async: 60
      poll: 0

    - name: Force kill if still running
      shell: pkill -9 -f tomcat
      when: sessions is failed or sessions.stdout contains "0"

    - name: Start Tomcat
      shell: /usr/local/tomcat/bin/startup.sh

    - name: Wait for Tomcat to start
      wait_for:
        port: 8080
        delay: 10
        timeout: 120

3. 使用监控工具(高级方案)

Prometheus + Alertmanager + 脚本
# prometheus告警规则
groups:
  - name: tomcat_alerts
    rules:
      - alert: TomcatDown
        expr: up{job="tomcat"} == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "Tomcat instance {{ $labels.instance }} down"

配合Webhook自动执行重启:

#!/usr/bin/env python3
# alertmanager_webhook.py

import requests
import subprocess
import logging
from flask import Flask, request

app = Flask(__name__)

@app.route('/webhook', methods=['POST'])
def webhook():
    alert = request.json
    for a in alert['alerts']:
        if a['status'] == 'firing' and 'TomcatDown' in a['labels']['alertname']:
            instance = a['labels']['instance']
            logging.info(f"Restarting Tomcat on {instance}")

            # SSH到目标服务器重启
            subprocess.run([
                'ssh', f'user@{instance}',
                'systemctl restart tomcat'
            ])

    return 'OK', 200

三、综合部署建议

完整监控重启方案:

#!/bin/bash
# /usr/local/bin/tomcat-manager

case "$1" in
    start)
        systemctl start tomcat
        ;;
    stop)
        systemctl stop tomcat
        ;;
    restart)
        systemctl restart tomcat
        ;;
    status)
        curl -s http://localhost:8080 > /dev/null && echo "RUNNING" || echo "STOPPED"
        ;;
    monitor)
        # 放入后台运行
        nohup /usr/local/bin/tomcat-monitor.sh > /var/log/tomcat-monitor.log 2>&1 &
        ;;
    *)
        echo "Usage: $0 {start|stop|restart|status|monitor}"
        exit 1
        ;;
esac

crontab配置示例:

# 每天3:00定时重启
0 3 * * * /usr/local/bin/tomcat-manager restart >> /var/log/tomcat-daily.log 2>&1

# 每分钟检查一次(配合监控脚本)
* * * * * /usr/local/bin/check-tomcat.sh >> /var/log/tomcat-check.log 2>&1

四、注意事项

会话保持:重启前检查活跃会话,避免影响用户体验 日志轮转:配置logrotate防止日志过大 内存清理:重启前可考虑清理临时文件 依赖服务:确保数据库等依赖服务正常运行 通知机制:重启时发送通知到监控平台 灰度发布:生产环境建议分批重启

选择方案时考虑:

相关推荐