Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Linux 定時重啟 Tomcat 服務完整實作方案

編輯:Linux 教學

方案概述

Tomcat 長時間運行可能出現記憶體洩漏、執行緒耗盡等問題,導致服務無響應。本文提供一套完整的「偵測→優雅關閉→強制終止→重新啟動」自動化腳本,並支援詳細日誌記錄,適合生產環境部署。

核心腳本架構

採用雙腳本協作模式:

  • restart.sh:主控腳本,負責進程偵測、決策啟動/重啟流程
  • retomcat.sh:執行腳本,專責優雅關閉、強制殺進程、重新啟動

restart.sh - 主控腳本

#!/bin/bash
# 載入系統環境變數
. /etc/profile

LOG_FILE="/usr/java/bak/restartTomcat.log"
TOMCAT_HOME="/usr/java/tomcat5"
TOMCAT_KEYWORD="tomcat5"  # 進程識別關鍵字
EXCLUDE_KEYWORD="retomcat" # 排除自身腳本進程

# 寫入日誌分隔符
{
  echo ""
  echo ""
  echo "====================================================="
  echo "===== [$(date +'%Y-%m-%d %H:%M:%S')] 開始檢查任務 ====="
  echo "====================================================="
} >> "${LOG_FILE}"

# 取得 Tomcat 進程 PID(排除 grep 與 retomcat 自身)
PID=$(ps aux | grep "${TOMCAT_KEYWORD}" | grep -v grep | grep -v "${EXCLUDE_KEYWORD}" | awk '{print $2}')

echo "AA: 偵測到進程 PID = ${PID}" >> "${LOG_FILE}"

if [ -n "${PID}" ]; then
    # 進程存在,執行重啟腳本
    . /usr/java/retomcat.sh
else
    # 進程不存在,直接啟動
    echo "AA: [$(date +'%Y-%m-%d %H:%M:%S')] [WARN] Tomcat 未運行,嘗試啟動..." >> "${LOG_FILE}"
    ${TOMCAT_HOME}/bin/startup.sh >> "${LOG_FILE}" 2>&1
fi

retomcat.sh - 重啟執行腳本

#!/bin/bash
LOG_FILE="/usr/java/bak/restartTomcat.log"
TOMCAT_HOME="/usr/java/tomcat5"

# 記錄開始關閉
echo "AA: [$(date +'%Y-%m-%d %H:%M:%S')] Tomcat 正在運行,準備關閉..." >> "${LOG_FILE}"

# 1. 優雅關閉
${TOMCAT_HOME}/bin/shutdown.sh >> "${LOG_FILE}" 2>&1
sleep 10

# 2. 檢查是否已關閉
PID=$(ps aux | grep "tomcat5" | grep -v grep | grep -v retomcat | awk '{print $2}')

# 3. 強制終止殘留進程
while [ -n "${PID}" ]; do
    echo "AA: [$(date +'%Y-%m-%d %H:%M:%S')] 正常關閉失敗,殘留 PID = ${PID}" >> "${LOG_FILE}"
    echo "AA: [$(date +'%Y-%m-%d %H:%M:%S')] 執行強制終止 kill -9 ${PID}" >> "${LOG_FILE}"
    kill -9 ${PID}
    sleep 60
    PID=$(ps aux | grep "tomcat5" | grep -v grep | grep -v retomcat | awk '{print $2}')
done

# 4. 確認關閉成功,等待資源釋放
echo "AA: [$(date +'%Y-%m-%d %H:%M:%S')] Tomcat 已成功關閉" >> "${LOG_FILE}"
sleep 180  # 等待 3 分鐘讓端口、資源完全釋放

# 5. 重新啟動
echo "AA: [$(date +'%Y-%m-%d %H:%M:%S')] 開始啟動 Tomcat..." >> "${LOG_FILE}"
${TOMCAT_HOME}/bin/startup.sh >> "${LOG_FILE}" 2>&1

部署步驟

  1. 將兩個腳本放置於 /usr/java/bak/ 目錄
  2. 賦予執行權限:
    chmod +x /usr/java/bak/restart.sh
    chmod +x /usr/java/bak/retomcat.sh
  3. 設定 crontab 定時任務(每天凌晨 5 點執行):
    crontab -e
    # 加入以下行
    0 5 * * * /usr/java/bak/restart.sh

關鍵設計考量

環節設計理由參數建議
優雅關閉讓 Tomcat 完成請求處理、釋放資源、持久化 Sessionshutdown.sh + 10s 等待
強制終止防止死鎖導致無法關閉,避免端口佔用kill -9 + 60s 間隔重試
啟動前等待確保端口(8080/8009)完全釋放,避免 BindException180 秒(視機器效能調整)
日誌記錄便於事後追蹤、審計、自動化監控解析統一時間戳格式、關鍵動作標記

進階優化建議

  • 健康檢查整合:啟動後透過 curl -f https://localhost:8080/health 驗證服務真正可用
  • JVM 參數調優:在 setenv.sh 設定 -XX:+HeapDumpOnOutOfMemoryError 自動產生堆轉儲
  • 日誌輪轉:配合 logrotate 管理 restartTomcat.log,避免磁碟寫滿
  • 系統服務化:建議改用 systemd 管理 Tomcat,利用 Restart=on-failure 內建自動重啟
Copyright © Windows教程網 All Rights Reserved