因為使用阿裡雲部署伺服器應用時,Tomcat服務經常由于記憶體不足出現OutOfMemoryError異常的情況。經常過幾天就需要重新開機一次伺服器,更要命的是不知道什麼時候會由于記憶體不足導緻無法通路,如果重新開機不及時嚴重影響系統體驗。
為了解決上述問題,一方面是對tomcat配置做一些優化,網上有很多文章講解如何優化Tomcat記憶體設定;另一方面就是寫一個shell腳本,每天定時重新開機Tomcat服務。這裡主要記錄一下如何寫shell腳本并且配置定時任務。本人使用的環境是阿裡雲Ubuntu伺服器,以下配置在阿裡雲的Ubuntu伺服器上能正常運作。
一、建立Shell腳本
建立一個tomcat.sh檔案,輸入以下内容:
#!/bin/bash
. /etc/profile
tomcatPath="/usr/local/tomcat"
binPath="$tomcatPath/bin"
echo "[info][$(date +'%F %H:%M:%S')]正在監控tomcat,路徑:$tomcatPath"
pid=`ps -ef | grep tomcat | grep -w $tomcatPath | grep -v 'grep' | awk '{print $2}'`
if [ -n "$pid" ]; then
echo "[info][$(date +'%F %H:%M:%S')]tomcat程序為:$pid"
echo "[info][$(date +'%F %H:%M:%S')]tomcat已經啟動,準備使用shutdown指令關閉..."
$binPath"/shutdown.sh"
sleep 2
pid=`ps -ef | grep tomcat | grep -w $tomcatPath | grep -v 'grep' | awk '{print $2}'`
if [ -n "$pid" ]; then
echo "[info][$(date +'%F %H:%M:%S')]使用shutdown指令關閉失敗,準備kill程序..."
kill -9 $pid
echo "[info][$(date +'%F %H:%M:%S')]kill程序完畢!"
sleep 1
else
echo "[info][$(date +'%F %H:%M:%S')]使用shutdown指令關閉成功!"
fi
else
echo "[info][$(date +'%F %H:%M:%S')]tomcat未啟動!"
fi
echo "[info][$(date +'%F %H:%M:%S')]準備啟動tomcat..."
$binPath"/startup.sh"
腳本的邏輯比較簡單,先檢視tomcat程序是否存在,如果不存在則直接調用startup.sh指令啟動tomcat,如果tomcat的程序存在則調用shutdown.sh指令停掉tomcat服務,有時會關閉失敗,是以在檢查一下tomcat程序時候還存在,如果存在就使用kill指令殺掉該程序,然後啟動tomcat。
這裡有一個地方需要注意,第二行代碼(. /etc/profile)不能省掉,需要将環境變量引入到目前腳本環境中,要不然會導緻啟動定時任務時運作腳本失敗,會報以下錯誤:
Neither the JAVA_HOME nor the JRE_HOME environment variable is defined At least one of these environment variable is needed to run this program
二、修改檔案權限
要讓腳本可以執行,當然要把檔案設定為可執行檔案了。
chmod 777 tomcat.sh
三、建立定時任務
在控制台上輸入使用crontab -e 指令進入編輯crontab腳本,第一次輸入該指令時需要選擇編輯器。

選擇vim編輯器編輯就可,在檔案後面增加一條任務。(我的腳本檔案路徑是:/home/script/tomcat.sh)
然後儲存并退出即可,接着使用crontab -l指令即可看到剛才新增的定時任務在清單裡面。一般情況是直接生效,如果沒有生效可以使用sudo service cron restart指令重新開機定時任務。
sudo service cron restart
四、定時任務描述文法
crontab中每一個定時任務的格式由6部分組成,分别是分鐘、小時、天、月、星期以及指令,前5部分用來配置任務觸發時機,中間使用空格隔開,如下:
minute hour day month dayofweek command
- minute – 表示分鐘,值的範圍是從0到59的整數
- hour – 表示小時,值的範圍是從0到23的整數
- day – 表示天,值的範圍是從1到31的整數
- month – 表示月,值的範圍是從1到12的整數
- dayofweek – 表示星期,值的範圍是從0到6的整數 (0表示周日)
- command – 需要執行的指令(/home/script/tomcat.sh > /home/script/shlog.txt表示執行tomcat.sh腳本,并且把結果日志列印到shlo.txt中)
時間部分除了使用估計數字以外還可以配合星号(*),逗号(,),斜杠(/),橫杠(-)組合來表示其他意義。
1. 星号(*)
表示任意值,比如:
30 01 * * * command #每天的1:30執行指令
2. 逗号(,)
表示指定的時間,比如:
30 01 1,10,20 * * command #每月的1号、10号、20号的1:30分執行指令
3. 斜杠(/)
表示每隔多長時間,比如:
* */2 * * * command #每個2小時執行一次指令
4. 橫杠(-)
表示連續時間,比如:
* 1-7/1 * * * command #淩晨1點-7點之前每隔一小時執行一次指令
五、其他
以上哪裡寫的不對或者有待改進,歡迎大家提意見,謝謝!
下載下傳位址:tomcat.sh
轉載請注明出處:http://www.luoxudong.com/?p=330