#!/bin/sh #java export JAVA_HOME=/root/java/jdk #日誌目錄 export LOG_HOME=`pwd`/ #項目名稱 APP_NAME=xxx.jar #jvm參數配置 export JAVA_OPTS="-server -Xmx1g -Xms1g -Xmn512m -XX:SurvivorRatio=4 -XX:PermSize=128m -XX:MaxPermSize=256m -Xss256k -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:MaxGCPauseMillis=50 -XX:GCPauseIntervalMillis=200 -XX:+DisableExplicitGC -Djava.awt.headless=true " #檢查程序運行狀態 checkpid(){ javaps=`ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'` if [ -n "$javaps" ]; then psid=`echo $javaps | awk '{print $1}'` else psid=0 fi } ################################### #(函數)啓動程序 #說明: #1. 首先調用checkpid函數,刷新$psid全局變量 #2. 若是程序已經啓動($psid不等於0),則提示程序已啓動 #3. 若是程序沒有被啓動,則執行啓動命令行 #4. 啓動命令執行後,再次調用checkpid函數 #5. 若是步驟4的結果可以確認程序的pid,則打印[OK],不然打印[Failed] #注意:echo -n 表示打印字符後,不換行 ################################### start() { checkpid if [ $psid -ne 0 ]; then echo "================================" echo "程序已經啓動! (pid=$psid)" echo "================================" else echo "啓動 ..." nohup $JAVA_HOME/bin/java $JAVA_OPTS -DLOG_HOME=$LOG_HOME -jar $APP_NAME > /dev/null 2>&1 & echo $! > tpid echo "啓動成功!" checkpid if [ $psid -ne 0 ]; then echo "(pid=$psid) [OK]" else echo "[Failed]" fi fi } ################################### #說明: #1. 首先調用checkpid函數,刷新$psid全局變量 #2. 若是程序已經啓動($psid不等於0),則開始執行中止,不然,提示程序未運行 #3. 使用kill -15 pid命令會先釋放本身的資源,而後在中止 #4. 執行kill命令行緊接其後,立刻查看上一句命令的返回值: $? #5. 若是步驟4的結果$?等於0,則打印[OK],不然打印[Failed] #6. 爲了防止java程序被啓動屢次,這裏增長反覆檢查進程,反覆殺死的處理(遞歸調用stop)。 #注意: 在shell編程中,"$?" 表示上一句命令或者一個函數的返回值 ################################### stop() { checkpid if [ $psid -ne 0 ]; then echo -n "中止程序 ...(pid=$psid) " kill -15 $psid if [ $? -eq 0 ]; then echo "[OK]" else echo "[Failed]" fi checkpid if [ $psid -ne 0 ]; then stop fi else echo "================================" echo "程序沒有運行!!!" echo "================================" fi } ################################### #說明: #1. 首先調用checkpid函數,刷新$psid全局變量 #2. 若是程序已經啓動($psid不等於0),則提示正在運行並表示出pid #3. 不然,提示程序未運行 ################################### status() { checkpid if [ $psid -ne 0 ]; then echo "程序正在運行! (pid=$psid)" else echo "程序沒有運行!!!" fi } ################################### #(函數)打印系統環境參數 ################################### info() { echo "System Information:" echo "****************************" echo `head -n 1 /etc/issue` echo `uname -a` echo echo "JAVA_HOME=$JAVA_HOME" echo `$JAVA_HOME/bin/java -version` echo echo "APP_NAME=$APP_NAME" echo "LOG_HOME=$LOG_HOME" echo "****************************" } ################################### #讀取腳本的第一個參數($1),進行判斷 #參數取值範圍:{start|stop|restart|status|info} #如參數不在指定範圍以內,則打印幫助信息 ################################### case "$1" in 'start') start ;; 'stop') stop ;; 'restart') stop start ;; 'status') status ;; 'info') info ;; *) echo "Usage: $0 {start|stop|restart|status|info}" exit 1 esac exit 0