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~$9
命令列中的輸入引數$0
指令碼檔案的名稱$*
或者[email protected]
命令列中的所有引數,有區別的。$$
當前的shell指令碼程序的Id號碼$?
上一個命令或者函式的返回值$!
最近一次啟動後臺的程序的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簡單的語法
- 定義變數直接寫變數的名稱value=xxx就行了
- 使用變數
$value
- 使用雙引號可以引用除了‘$’、‘`’(這個是反引號~那個鍵這個不加shfit,不同於引號)、‘\’外的任意的字串,意思就是要解釋這個變數代表的意義。
- ‘’’單引號就不允許有變數的替換,而不對它做shell解釋。這個和反引號不一樣,作者被坑了好久。
命令替換(將字串的執行結果輸出來)
比如定義了一個變數 cmd=”ls -l” 使用兩種方式可以執行
1. 使用反引號
echo `$cmd`
value1=`echo $cmd`
- 使用$()命令替換,將輸出結果給予一個變數或者其他的
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
- 首先判斷是否有當前的程序
- 啟動當前程序
這裡就是“反向單引號使用成了單引號”,shell不解析執行,所以使用了第一個這種方式來展現我們的程序號和JAR的名稱。 - 或者使用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_
【java】Linux使用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 " 開始執行操