1. 程式人生 > >不錯的linux下通用的java程式啟動指令碼

不錯的linux下通用的java程式啟動指令碼

開發十年,就只剩下這套架構體系了! >>>   

#!/bin/sh
#該指令碼為Linux下啟動java程式的通用指令碼。即可以作為開機自啟動service指令碼被呼叫,
#也可以作為啟動java程式的獨立指令碼來使用。
#
#Author: tudaxia.com, Date: 2011/6/7
#
#警告!!!:該指令碼stop部分使用系統kill命令來強制終止指定的java程式程序。
#在殺死程序前,未作任何條件檢查。在某些情況下,如程式正在進行檔案或資料庫寫操作,
#可能會造成資料丟失或資料不完整。如果必須要考慮到這類情況,則需要改寫此指令碼,
#增加在執行kill命令前的一系列檢查。
#
#
###################################
#環境變數及程式執行引數
#需要根據實際環境以及Java程式名稱來修改這些引數
###################################
#JDK所在路徑
JAVA_HOME="/usr/java/jdk"
 
#執行程式啟動所使用的系統使用者,考慮到安全,推薦不使用root帳號
RUNNING_USER=root
 
#Java程式所在的目錄(classes的上一級目錄)
APP_HOME=/opt/tudaxia/test/WEB-INF
 
#需要啟動的Java主程式(main方法類)
APP_MAINCLASS=com.tudaxia.test.TestMain
 
#拼湊完整的classpath引數,包括指定lib目錄下所有的jar
CLASSPATH=$APP_HOME/classes
for i in "$APP_HOME"/lib/*.jar; do
   CLASSPATH="$CLASSPATH":"$i"
done
 
#java虛擬機器啟動引數
JAVA_OPTS="-ms512m -mx512m -Xmn256m -Djava.awt.headless=true -XX:MaxPermSize=128m"
 
###################################
#(函式)判斷程式是否已啟動
#
#說明:
#使用JDK自帶的JPS命令及grep命令組合,準確查詢pid
#jps 加 l 引數,表示顯示java的完整包路徑
#使用awk,分割出pid ($1部分),及Java程式名稱($2部分)
###################################
#初始化psid變數(全域性)
psid=0
 
checkpid() {
   javaps=`$JAVA_HOME/bin/jps -l | grep $APP_MAINCLASS`
 
   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 表示列印字元後,不換行
#注意: "nohup 某命令 >/dev/null 2>&1 &" 的用法
###################################
start() {
   checkpid
 
   if [ $psid -ne 0 ]; then
      echo "================================"
      echo "warn: $APP_MAINCLASS already started! (pid=$psid)"
      echo "================================"
   else
      echo -n "Starting $APP_MAINCLASS ..."
      JAVA_CMD="nohup $JAVA_HOME/bin/java $JAVA_OPTS -classpath $CLASSPATH $APP_MAINCLASS >/dev/null 2>&1 &"
      su - $RUNNING_USER -c "$JAVA_CMD"
      checkpid
      if [ $psid -ne 0 ]; then
         echo "(pid=$psid) [OK]"
      else
         echo "[Failed]"
      fi
   fi
}
 
###################################
#(函式)停止程式
#
#說明:
#1. 首先呼叫checkpid函式,重新整理$psid全域性變數
#2. 如果程式已經啟動($psid不等於0),則開始執行停止,否則,提示程式未執行
#3. 使用kill -9 pid命令進行強制殺死程序
#4. 執行kill命令列緊接其後,馬上檢視上一句命令的返回值: $?
#5. 如果步驟4的結果$?等於0,則列印[OK],否則列印[Failed]
#6. 為了防止java程式被啟動多次,這裡增加反覆檢查程序,反覆殺死的處理(遞迴呼叫stop)。
#注意:echo -n 表示列印字元後,不換行
#注意: 在shell程式設計中,"$?" 表示上一句命令或者一個函式的返回值
###################################
stop() {
   checkpid
 
   if [ $psid -ne 0 ]; then
      echo -n "Stopping $APP_MAINCLASS ...(pid=$psid) "
      su - $RUNNING_USER -c "kill -9 $psid"
      if [ $? -eq 0 ]; then
         echo "[OK]"
      else
         echo "[Failed]"
      fi
 
      checkpid
      if [ $psid -ne 0 ]; then
         stop
      fi
   else
      echo "================================"
      echo "warn: $APP_MAINCLASS is not running"
      echo "================================"
   fi
}
 
###################################
#(函式)檢查程式執行狀態
#
#說明:
#1. 首先呼叫checkpid函式,重新整理$psid全域性變數
#2. 如果程式已經啟動($psid不等於0),則提示正在執行並表示出pid
#3. 否則,提示程式未執行
###################################
status() {
   checkpid
 
   if [ $psid -ne 0 ];  then
      echo "$APP_MAINCLASS is running! (pid=$psid)"
   else
      echo "$APP_MAINCLASS is not running"
   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_HOME=$APP_HOME"
   echo "APP_MAINCLASS=$APP_MAINCLASS"
   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

雖然寫起動shell的頻率非常不高。。。但是每次要寫都要對付一大堆的jar檔案路徑,新加jar包也必須要修改起動shell。

在網上找到一個挺好的通用shell指令碼。

只需要修改一些配置變數,就可以用來做起動指令碼了。

並且除了能起動、還支援關閉、重啟、檢視是否正在執行的功能。

原文地址:http://www.tudaxia.com/archives/10

start函式中,nohup部分其實也可以提出來放入一個配置變數中。這裡沒有修改直接