Tomcat宕机自动重启和每日定时启动可以通过以下几种方式实现:
#!/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
; /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
; /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
# 每日凌晨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
# 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
# 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
# 每天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
选择方案时考虑: