Tomcat 長時間運行可能出現記憶體洩漏、執行緒耗盡等問題,導致服務無響應。本文提供一套完整的「偵測→優雅關閉→強制終止→重新啟動」自動化腳本,並支援詳細日誌記錄,適合生產環境部署。
採用雙腳本協作模式:
#!/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
#!/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
/usr/java/bak/ 目錄chmod +x /usr/java/bak/restart.sh
chmod +x /usr/java/bak/retomcat.sh
crontab -e
# 加入以下行
0 5 * * * /usr/java/bak/restart.sh
| 環節 | 設計理由 | 參數建議 |
|---|---|---|
| 優雅關閉 | 讓 Tomcat 完成請求處理、釋放資源、持久化 Session | shutdown.sh + 10s 等待 |
| 強制終止 | 防止死鎖導致無法關閉,避免端口佔用 | kill -9 + 60s 間隔重試 |
| 啟動前等待 | 確保端口(8080/8009)完全釋放,避免 BindException | 180 秒(視機器效能調整) |
| 日誌記錄 | 便於事後追蹤、審計、自動化監控解析 | 統一時間戳格式、關鍵動作標記 |
curl -f https://localhost:8080/health 驗證服務真正可用setenv.sh 設定 -XX:+HeapDumpOnOutOfMemoryError 自動產生堆轉儲logrotate 管理 restartTomcat.log,避免磁碟寫滿systemd 管理 Tomcat,利用 Restart=on-failure 內建自動重啟