LINUX下做JAVA程序啓動腳本(優化可執行Raspbian Debian9U1)

1. 正式可以運行的版本,在原來的內容上跟進編譯時的問題,做了一些調整,Raspbian Debian9U1版本上通過

2. LINUX下做JAVA程序啓動腳本

3. 自啓動命令:

3.1 debian下加入自啓動服務 update-rc.d servicefilename defaults,刪除自啓動  update-rc.d -f servicefilename remove

3.2 chkconfig --list servicefilename查看on/off情況

3.3 systemctl status  servicefilename 檢查shell腳本錯誤情況


#!/bin/sh

### BEGIN INIT INFO
# Provides:	     runled
# Required-Start:    $local_fs $remote_fs $network $syslog $named
# Required-Stop:     $local_fs $remote_fs $network $syslog $named
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts the runled
# Description:       starts runled
### END INIT INFO

#該腳本爲Linux下啓動java程序的通用腳本。即可以作爲開機自啓動service腳本被調用,
#也可以作爲啓動java程序的獨立腳本來使用。
#
#
#警告!!!:該腳本stop部分使用系統kill命令來強制終止指定的java程序進程。
#在殺死進程前,未作任何條件檢查。在某些情況下,如程序正在進行文件或數據庫寫操作,
#可能會造成數據丟失或數據不完整。如果必須要考慮到這類情況,則需要改寫此腳本,
#增加在執行kill命令前的一系列檢查。
#
#
###################################
#環境變量及程序執行參數
#需要根據實際環境以及Java程序名稱來修改這些參數
###################################
#JDK所在路徑
JAVA_HOME="/usr/lib/jvm/jdk-8-oracle-arm32-vfp-hflt"
#拼湊帶完整路徑的JAVA和JPS命令串,以解決函數內用JAVA_HOME/bin時JAVA_HOME變量拼不出來問題
JAVADO=$JAVA_HOME/bin/java
JPSDO=$JAVA_HOME/bin/jps

#echo $JAVADO
#echo $JPSDO

#執行程序啓動所使用的系統用戶,考慮到安全,推薦不使用root帳號
RUNNING_USER=root
#Java程序所在的目錄(classes的上一級目錄)
APP_HOME="/usr/testdev/helloworld/myfirstjava"
#需要啓動的Java主程序(main方法類)
APP_MAINCLASS="LEDBreathingLight"

#拼湊完整的classpath參數,包括指定lib目錄下所有的jar
#CLASSPATH=$APP_HOME/classes
#for i in "$APP_HOME"/lib/*.jar; do
#   CLASSPATH="$CLASSPATH":"$i"
#done
CLASSPATH=$APP_HOME/classes
LIBPATH=`find /usr/testdev/pi4jlibs -name *.jar|xargs|sed "s/ /:/g"`
CLASSPATH="$CLASSPATH":"$LIBPATH"
#java虛擬機啓動參數
#JAVA_OPTS="-ms512m -mx512m -Xmn256m -Djava.awt.headless=true -XX:MaxPermSize=128m"
#echo $JAVA_HOME
#echo $APP_HOME
#echo $APP_MAINCLASS
#echo $CLASSPATH


###################################
#(函數)判斷程序是否已啓動
#
#說明:
#使用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`
	
   javaps=`$JPSDO -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 ..."
      echo 
      echo $JAVA_HOME
      #JAVA_CMD="nohup $JAVA_HOME/bin/java $JAVA_OPTS -classpath $CLASSPATH $APP_MAINCLASS >/dev/null 2>&1 &"
      JAVA_CMD="nohup $JAVADO -classpath $CLASSPATH $APP_MAINCLASS >/dev/null 2>&1 &"
      echo $JAVA_CMD
      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

esac



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章