天天看點

Linux系統上實作定時重新開機Tomcat服務

因為使用阿裡雲部署伺服器應用時,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腳本,第一次輸入該指令時需要選擇編輯器。

Linux系統上實作定時重新開機Tomcat服務

選擇vim編輯器編輯就可,在檔案後面增加一條任務。(我的腳本檔案路徑是:/home/script/tomcat.sh)

Linux系統上實作定時重新開機Tomcat服務

然後儲存并退出即可,接着使用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

繼續閱讀