1. 程式人生 > >linux shell 指令碼啟動Java總結

linux shell 指令碼啟動Java總結

linux shell 使用總結

Linux shell對於我們去傻瓜式的去操作一系列的命令非常的方便,比如啟動java程式,啟動tomact也是通過操作shell來處理的。比如下面操作啟動Tomact
由於使用者不懂配置處理JDK這些都是需要我們來處理的哦!所以,這樣更加的方便使用者去操作和使用,同時對於技術支援工程師也是比較的便利。
xxx.sh

export CATALINA_HOME=$(cd `dirname $0`;pwd)
export JAVA_HOME=$(cd `dirname $0`;pwd)/jdk-linux
export JRE_HOME=$(cd `dirname $0
`;pwd)/jdk-linux/jre export JAVA_OPTS="-server -Xms2048m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=256M" exec bin/startup.sh

許可權要給足夠,遞迴的將124 使用者 使用者 組其 他人的許可權都通通給予

chmod -R 777 *

shell中常用的特殊的欄位

  1. $1~$9命令列中的輸入引數
  2. $0指令碼檔案的名稱
  3. $* 或者 [email protected]命令列中的所有引數,有區別的。
  4. $$當前的shell指令碼程序的Id號碼
  5. $? 上一個命令或者函式的返回值
  6. $!最近一次啟動後臺的程序的ID
    如下就是使用最近一次的後臺啟動的ID重定向到一個檔案中去
    不過這裡沒有考慮是否已經啟動的問題。
SERVER=/home/java/server  
cd $SERVER    
case "$1" in    
  start)  
    nohup java -Xmx128m -jar XXX.jar > $SERVER/server.log 2>&1 &  
    echo $! > $SERVER/server.pid  
    ;;    
  stop)  
    kill `cat $SERVER/server
.pid` rm -rf $SERVER/server.pid ;; restart) $0 stop sleep 1 $0 start ;; *) echo "Usage: run.sh {start|stop|restart}" ;; esac exit 0

shell簡單的語法

  1. 定義變數直接寫變數的名稱value=xxx就行了
  2. 使用變數$value
  3. 使用雙引號可以引用除了‘$’、‘`’(這個是反引號~那個鍵這個不加shfit,不同於引號)、‘\’外的任意的字串,意思就是要解釋這個變數代表的意義。
  4. ‘’’單引號就不允許有變數的替換,而不對它做shell解釋。這個和反引號不一樣,作者被坑了好久。

命令替換(將字串的執行結果輸出來)

比如定義了一個變數 cmd=”ls -l” 使用兩種方式可以執行
1. 使用反引號

echo `$cmd`
value1=`echo $cmd`
  1. 使用$()命令替換,將輸出結果給予一個變數或者其他的
value1=$($cmd)

這種反單引號可以解析裡面的shell的哦,我之前用的單引號,被坑了很久才發現。

控制結構中的比較test[expression]

可以通過man test查詢很多的比較資訊,if~else之內的使用很多的額
1. 字串不為空 -n String
2. 兩個字串比較 String1=String2 相等結果為真 !=
3. 兩個表示式算數比較 expression1 -eq expression2 相等結果為真
4. -ne 不相等,-gt大於為真,ge大於等於,lt小於,le小於等於,!expression
5. -d file 這是一個檔案為真…..
6. for variable in argument-list
do
做事情
done
7. 函式,直接書寫函式名稱就是呼叫啦
funcionname(){
}

後臺執行nohup command >/dev/null 2>&1 &

  • 標準輸出重定向到 /dev/null (a dummy device that does not record any output)
  • 2>&1 標準出錯重定向到標準輸出,也到/dev/null

JPS -l (JDK提供的檢視執行Java程式的程序號)

  • 利用這個命令我們可以檢視當前的程式是否執行,或者找到程式殺死程序。
  • -l 輸出應用程式main class的完整package名 或者 應用程式的jar檔名

su -

輸入密碼之後,後面的都使用管理員的許可權去執行程式。

字元編碼問題

  • 由於使用xshell編寫bash,在windows上面的編碼不正確,導致linux執行錯誤
  • 怎麼檢視編碼vi xxx.file 命令模式下
  • :set ff? 可以檢視當前的是doc還是unix編碼
  • set ff=unit處理為unix編碼

awk是一個強大的文字分析工具

相對於grep的查詢awk在其對資料分析並生成報告時,顯得尤為強大。簡單來說awk就是把檔案逐行的讀入,以空格為預設分隔符將每行切片,切開的部分再進行各種分析處理。

  • 例子last -n 5 取出前五個
root     pts/1   192.168.1.100  Tue Feb 10 11:21   still logged in
root     pts/1   192.168.1.100  Tue Feb 10 00:46 - 02:28  (01:41)
root     pts/1   192.168.1.100  Mon Feb  9 11:41 - 18:30  (06:48)
dmtsai   pts/1   192.168.1.100  Mon Feb  9 11:41 - 11:41  (00:00)
root     tty1                   Fri Sep  5 14:09 - 14:10  (00:01)
如果只是顯示最近登入的5個帳號,$1 返回的資料的第一個
last -n 5 | awk  '{print $1}'
root
root
root
dmtsai
root

啟動一個JAR

  1. 首先判斷是否有當前的程序
  2. 啟動當前程序
    這裡就是“反向單引號使用成了單引號”,shell不解析執行,所以使用了第一個這種方式來展現我們的程序號和JAR的名稱。
  3. 或者使用javaps=$JAVA_HOME/bin/jps -l |grep $MAIN_JAR_NAME
    • 檢測程序是否存在
#或者 javaps=`$JAVA_HOME/bin/jps -l |grep $MAIN_JAR_NAME`
psid=0
checkpid() {   
   javaps=$(eval "$JAVA_HOME/bin/jps -l |grep $MAIN_JAR_NAME")
   if [ -n "$javaps" ]; then
      psid=`echo $javaps | awk '{print $1}'`
   else
      psid=0
   fi
}
  • 啟動程序
start() {
   #檢測是否已經啟動
   checkpid 
   #不等於0當前已經啟動了
   if [ $psid -ne 0 ]; then
      echo "================================"
      echo "warn:  already started! (pid=$psid)"
      echo "================================"
   else
      echo -n "Starting  ..."
      nohup $JAVA_HOME/bin/java $JAVA_OPTS -jar $MAIN_JAR_NAME >/dev/null 2>&1 &     
      checkpid
      if [ $psid -ne 0 ]; then
         echo "(pid=$psid) [OK]"
      else     
         echo "[Failed]"
      fi
   fi
}

可執行JAR

  • java命令執行jar包的方式 考慮的問題網址
    首先你需要知道Jar包分為可執行Jar和非可執行Jar,一個可執行的Jar檔案是一個自包含的Java應用程式,它儲存在特別配置的JAR檔案中,可以由JVM直接執行它而無需事先提取檔案或者設定類路徑。要執行儲存在非可執行的JAR中的應用程式,必須將它加入到您的類路徑中,並用名字呼叫應用程式的主類。但是使用可執行的JAR檔案,我們可以不用提取它或者知道主要入口點就可以執行一個應用程式。可執行JAR有助於方便釋出和執行Java應用程式。

  • 對於可執行Jar,在執行java -jar選項的時候,那麼環境變數CLASSPATH和在命令列中指定的所有類路徑都將被JVM忽略,也就是說,對於一個可執行Jar,使用java -classpath或者java -cp或者set classpath=lib/commons-io-2.4.jar等等命令指定CLASSPATH都是無效的。

對於一個可執行的JAR必須通過MANIFEST.MF檔案的頭引用它所需要的所有其他從屬JAR,引用方式如下

Manifest-Version: 1.0
Built-By: fuqunqing
Build-Jdk: 1.7.0_65
Class-Path: lib/asm-2.2.3.jar lib/spring-core-3.0.6.RELEASE.jar lib/sp
 ring-asm-3.0.6.RELEASE.jar lib/spring-beans-3.0.6.RELEASE.jar lib/spr
 ing-aop-3.0.6.RELEASE.jar lib/aopalliance-1.0.jar 
Created-By: Apache Maven 3.0.5 
Main-Class: com.XXX.MainClass
Archiver-Version: Plexus Archiver
  • Main-Class是jar檔案的主類,程式的入口
  • Class-Path指定需要的jar,多個jar必須要在一行上,多個jar之間以空格隔開,如果引用的jar在當前目錄的子目錄下,windows下使用\來分割,linux下用/分割檔案的冒號後面必須要空一個空格,否則會出錯檔案的最後一行必須是一個回車換行符,否則也會出錯.所以最好在自己的平臺打包。

一個完整的標準的啟動指令碼

#!/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

相關推薦

linux shell 指令碼啟動Java總結

linux shell 使用總結 Linux shell對於我們去傻瓜式的去操作一系列的命令非常的方便,比如啟動java程式,啟動tomact也是通過操作shell來處理的。比如下面操作啟動Tomact 由於使用者不懂配置處理JDK這些都是需要我們來處理的哦

Linux shell指令碼啟動 停止 重啟jar包

  最近做的微服務jar包想弄在持續整合中自動化部署,所以首先得有一個操作jar包的指令碼 只需將jar檔案的路徑替換到APP_NAME的值就可以了,其他不用改 注意:window編輯的shell檔案,通過WinSCP上傳的Linux伺服器,需要改變檔案的格式(檢視檔案格式,vim編

linux--shell指令碼啟動和停止jar包

完整指令碼啟動和停止jar包 #! /bin/sh PORT=8086 HOME='/usr/local/beta' LOG_HOME='/usr/local/beta/build' LOG_FILE='act-service.log' JAR_HOME=act-1.0.

Linux--shell指令碼執行方法總結

linux下新建一個print hello world的指令碼程式,如下所示: ~/boke---> vim hello.sh ~/boke---> cat hello.sh #!/b

Linux shell指令碼啟動 停止 重啟服務(jar)

 注意:window編輯的shell檔案,通過WinSCP上傳的Linux伺服器,需要改變檔案的格式(檢視檔案格式,vim編輯後輸入 :set ff) #!/bin/bash export JAVA_

javaLinux使用nohup命令啟動sh shell 指令碼java程式無限迴圈啟動問題。解決方案

一·背景 專案使用spring boot 搭建。在Linux作業系統使用nohup命令啟動sh shell 指令碼,程式無限迴圈啟動,只要是 讓程式在後臺啟動 都會無限迴圈啟動(程式本來應該啟動完畢的,但是從日誌上看程式又再次啟動了一遍,無限迴圈,而且程式也無法正常訪問)

java 呼叫 linux shell 指令碼,並讀取返回值

String[] cmd = {"/bin/sh", "-c", "ps -elf | grep -v grep | grep EuropeStaticsEntrance | wc -l"}; while (true) { StringBuilder sb = ne

Java之怎麼通過java去呼叫並執行shell指令碼以及問題總結(轉)

背景 我們在開發過程中,大部分是java開發, 而在文字處理過程中,主要就是指令碼進行開發。 java開發的特點就是我們可以很早地進行TDDL, METAQ 等等地對接; 而指令碼開發的特點就是在進行批處理的時候非常方便。 前陣子我遇到這麼一個需求場景: 對抓

linux--shell指令碼批量啟動和停止jar包

指令碼程式碼all.sh #! /bin/sh # 埠號 PORTS=(8084 8083 8085 8086) # 系統模組 MODULES=(mcht system user act) # 系統模組名稱 MODULE_NAMES=(商戶模組 系統模組 使用者模組 活動

Linux-Shell指令碼程式設計基礎(1)

1. 我們一般在使用Linux系統的時候,都活接觸到shell指令碼的使用,例如我們經常在linux系統中使用的ls命令、cd命令等,都是衣蛾簡單而又基本的shell命令,在 linux系統中我們一般的使用如下的格式來進行shell指令碼的編寫: (1)格式 #!bin/bash e

學習Linux shell指令碼中連線字串的方法

這篇文章主要介紹了Linux shell指令碼中連線字串的方法,如果想要在變數後面新增一個字元,可以用一下方法: 程式碼如下: $value1=home $value2=${value1}"=" echo $value2 把要新增的字串變數新增{},並且需要把$放到外面。 這樣輸出的結果

Linux Shell指令碼獲取當前路徑

shell指令碼獲取當前路徑 #方法一 #!/usr/bin/env bash Cur_Dir=$(pwd) echo $Cur_Dir #方法二 #!/usr/bin/env bash basedir=cd $(dirname $0); pwd

linux shell 指令碼【1】 ---- echo 與 printf 用法

終端列印的常用命令有 echo 和 printf 兩種。 先說基本用法: echo: 1. echo Hello Word ! 命令列輸出:Hello Word ! 2. echo 'Hello Word !' 命令列輸出:Hello Word ! 3. echo

linux shell 指令碼【3】 ---- 重定向 與 tee 命令

1.重定向: echo "ABCD"  > temp.txt 將ABCD寫入到temp.txt中 echo "ABCD" >> temp.txt 講ABCD追加到temp.txt中 其中  > 相當於 1>

linux shell 指令碼【2】 ---- 數學運算

在Bash shell環境中,可以利用 let、 (()) 、 [ ]、 expr 、  bc 進行數學運算 用法直接上程式碼,如下: #! /bin/bash echo "數學運算篇 START" #基本運算----let a=5; b=4; echo "a = $a

Linux Shell指令碼程式設計 --awk命令詳解

簡單使用: awk :對於檔案中一行行的獨處來執行操作 。 awk -F :'{print $1,$4}'   :使用‘:’來分割這一行,把這一行的第一第四個域打印出來 。    

寫一個shell指令碼啟動伺服器

使用shell指令碼寫一個一鍵啟動伺服器 ####由於我們伺服器使用的docker, nginx和 redis 還有mysql都是docker啟動好的 我們專案使用supervisor程序管理工具,需要提前配置,但是不知道什麼原因,以前的環境配置出了問題,supervisor不

Linux Shell 指令碼讀取配置檔案

一、應用場景 為了靈活應用shell指令碼,適當的加入配置檔案,對於後期的維護和優化會有很大幫助。例如指令碼中使用的檔案/檔案路徑,都可以通過讀取配置檔案完成。 配置檔案 filename=boomlee 指令碼檔案 #!/bin/bash workdir=$(cd $(di

Linux shell指令碼 自動輸入提示資訊或回車進行下一步操作

1.應用場景 有的時候執行安裝或操作第三方軟體時,需要輸入Yes 或者回車 才能進行下一步 例如操作sqlite [[email protected] sh]# sqlite3 anhui.db SQLite version 3.6.20 Enter ".help" fo

Linux shell指令碼按住任意鍵繼續操作

                         Linux shell指令碼按住任意鍵繼續操作   #!/bin/bash echo " 開始執行操