Tomcat 記憶體洩漏、執行緒卡死導致定期掛掉,臨時方案是「定時重啟」。本文完整演示 編寫關閉/啟動腳本 → 設定環境變數 → crontab 定時任務 → 日誌驗證 全流程,並補充生產環境優化建議 (GC 參數、JMX 監控、優雅關閉)。

/home/oracle/apache-tomcat-7.0.29//home/oracle/jdk1.7.0_67/oracle (需有 Tomcat 目錄讀寫權限)#!/bin/bash
# 檔案:/home/oracle/scripts/tomcat_shutdown.sh
export JAVA_HOME=/home/oracle/jdk1.7.0_67/
export CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
echo "======== begin stop the tomcat ========"
/home/oracle/apache-tomcat-7.0.29/bin/shutdown.sh
# 等待進程結束,最多 30 秒
for i in {1..30}; do
if ! pgrep -f "apache-tomcat-7.0.29" >/dev/null; then
echo "Tomcat stopped gracefully."
exit 0
fi
sleep 1
done
# 強制殺掉殘留進程
echo "Force killing remaining Tomcat processes..."
pkill -9 -f "apache-tomcat-7.0.29"
echo "Tomcat force stopped."

#!/bin/bash
# 檔案:/home/oracle/scripts/tomcat_startup.sh
export JAVA_HOME=/home/oracle/jdk1.7.0_67/
export CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
echo "======== begin start the tomcat ========"
/home/oracle/apache-tomcat-7.0.29/bin/startup.sh
# 簡單健康檢查:等待端口 8080 監聽
for i in {1..30}; do
if netstat -tlnp 2>/dev/null | grep -q ":8080 "; then
echo "Tomcat started successfully on port 8080."
exit 0
fi
sleep 1
done
echo "ERROR: Tomcat failed to start within 30 seconds."
exit 1
chmod +x /home/oracle/scripts/tomcat_shutdown.sh
chmod +x /home/oracle/scripts/tomcat_startup.sh
#!/bin/bash
# 檔案:/home/oracle/scripts/tomcat_restart.sh
/home/oracle/scripts/tomcat_shutdown.sh
sleep 5
/home/oracle/scripts/tomcat_startup.sh
# 以 oracle 用戶編輯 crontab
crontab -e
# 每天凌晨 3:30 重啟 (業務低峰期)
30 3 * * * /home/oracle/scripts/tomcat_restart.sh >> /home/oracle/logs/tomcat_restart.log 2>&1
# 或每週一凌晨 4:00 重啟
0 4 * * 1 /home/oracle/scripts/tomcat_restart.sh >> /home/oracle/logs/tomcat_restart.log 2>&1

* * * * * 執行指令
- - - - -
| | | └─ 星期 (0-7) (Sun=0 或 7)
| | └──── 月 (1-12)
| └────── 日 (1-31)
└──────── 時 (0-23)
# 查看 crontab 執行日誌 (系統層面)
grep CRON /var/log/syslog | tail -20
# 查看腳本自帶日誌
tail -f /home/oracle/logs/tomcat_restart.log
-Xms -Xmx 相等、啟用 G1GC、配置 -XX:+HeapDumpOnOutOfMemoryErrorserver.xml 設定 <Server port="8005" shutdown="SHUTDOWN">,腳本用 shutdown.sh 而非 kill -9logrotate 管理 catalina.out、localhost_access_log完成 腳本分離 → 環境變數固化 → crontab 定時 → 日誌留存 四步,即可建立可靠的 Tomcat 定時重啟機制,為排查根因爭取時間。記住:定時重啟是止痛藥,JVM 調優才是根治方案。