Shell 腳本管理 Java 程序的實(shí)現(xiàn)示例
一、為什么要用 Shell 腳本?
在開(kāi)發(fā)和部署 Java 程序時(shí),通常需要進(jìn)行一些重復(fù)性操作,如啟動(dòng)、停止、查看狀態(tài)以及重啟程序。手動(dòng)執(zhí)行這些操作往往麻煩且容易出錯(cuò),而通過(guò) Shell 腳本,可以將這些操作封裝為簡(jiǎn)單的命令行調(diào)用。
例如,假設(shè)每次部署后需要啟動(dòng)應(yīng)用,并查看是否正常運(yùn)行。Shell 腳本可以幫助我們實(shí)現(xiàn):
- 自動(dòng)啟動(dòng)程序并將輸出重定向到日志文件中。
- 檢查程序是否已經(jīng)在運(yùn)行,避免重復(fù)啟動(dòng)。
- 停止正在運(yùn)行的程序,確保優(yōu)雅關(guān)閉。
- 定期重啟程序,保持應(yīng)用的健康狀態(tài)。
使用 Shell 腳本可以提高操作的自動(dòng)化和可靠性,尤其是在自動(dòng)化部署、CI/CD 管道中,能夠大大簡(jiǎn)化運(yùn)維工作。
二、Shell 腳本的基礎(chǔ)知識(shí)
1. 基本結(jié)構(gòu)
Shell 腳本是一個(gè)包含一系列命令的文本文件,文件的第一行通常指定解釋器。最常見(jiàn)的解釋器是 bash,通過(guò) #!/bin/bash 來(lái)指定,表示后續(xù)的命令使用 bash 解釋器來(lái)執(zhí)行。
#!/bin/bash
2. 常用命令
- echo:將文本輸出到終端。
- ps:列出系統(tǒng)中運(yùn)行的進(jìn)程。
- kill:結(jié)束指定的進(jìn)程。
- nohup:忽略掛起信號(hào)(讓程序在后臺(tái)運(yùn)行,保持程序在會(huì)話關(guān)閉后仍然繼續(xù)運(yùn)行)。
- case ... in ... esac:條件語(yǔ)句,用于根據(jù)傳入的參數(shù)選擇不同的操作。
三、Shell 腳本示例分析
完整腳本
#!/bin/bash
# 配置部分
APP_NAME="myapp-1.0.jar" # 程序的 JAR 包名稱(chēng)
LOG_FILE="app.log" # 日志文件
PID_FILE="app.pid" # PID 文件,用于存儲(chǔ)程序的進(jìn)程 ID
# 腳本的主邏輯
case "$1" in
start)
# 檢查是否已經(jīng)運(yùn)行
if [ -f "$PID_FILE" ]; then
echo "程序已運(yùn)行,PID=$(cat $PID_FILE)"
exit 1
fi
# 后臺(tái)啟動(dòng)程序
echo "正在啟動(dòng)程序..."
nohup java -jar $APP_NAME > $LOG_FILE 2>&1 &
echo $! > $PID_FILE
echo "程序已啟動(dòng),PID=$(cat $PID_FILE)"
;;
stop)
# 檢查是否有運(yùn)行中的程序
if [ -f "$PID_FILE" ]; then
echo "正在停止程序,PID=$(cat $PID_FILE)..."
kill $(cat $PID_FILE)
rm -f $PID_FILE
echo "程序已停止"
else
echo "未找到運(yùn)行中的程序"
fi
;;
restart)
# 重啟程序
$0 stop
$0 start
;;
status)
# 檢查程序狀態(tài)
if [ -f "$PID_FILE" ]; then
echo "程序正在運(yùn)行,PID=$(cat $PID_FILE)"
else
echo "程序未運(yùn)行"
fi
;;
*)
# 提示用法
echo "用法: $0 {start|stop|restart|status}"
exit 1
;;
esac
腳本詳解
1. 變量配置
APP_NAME="myapp-1.0.jar" LOG_FILE="app.log" PID_FILE="app.pid"
APP_NAME:指定要運(yùn)行的 Java 程序的 JAR 文件名。LOG_FILE:日志文件,用于輸出程序的標(biāo)準(zhǔn)輸出和錯(cuò)誤輸出。PID_FILE:保存程序的進(jìn)程 ID,用于停止或查看程序的狀態(tài)。
2.start部分
if [ -f "$PID_FILE" ]; then
echo "程序已運(yùn)行,PID=$(cat $PID_FILE)"
exit 1
fi
nohup java -jar $APP_NAME > $LOG_FILE 2>&1 &
echo $! > $PID_FILE
echo "程序已啟動(dòng),PID=$(cat $PID_FILE)"
- 檢查是否正在運(yùn)行:通過(guò)檢查
$PID_FILE是否存在來(lái)判斷程序是否已經(jīng)啟動(dòng)。如果文件存在,說(shuō)明程序已在運(yùn)行,避免重復(fù)啟動(dòng)。 - 啟動(dòng)程序:使用
nohup命令在后臺(tái)運(yùn)行 Java 程序,并將程序的標(biāo)準(zhǔn)輸出和錯(cuò)誤輸出重定向到$LOG_FILE。$!獲取最近啟動(dòng)的進(jìn)程的 PID,并將其存入$PID_FILE中。
3.stop部分
if [ -f "$PID_FILE" ]; then
kill $(cat $PID_FILE)
rm -f $PID_FILE
echo "程序已停止"
else
echo "未找到運(yùn)行中的程序"
fi
- 檢查程序是否運(yùn)行:通過(guò)
$PID_FILE判斷程序是否在運(yùn)行。如果運(yùn)行,則發(fā)送kill信號(hào)停止程序,并刪除 PID 文件。
4.status部分
if [ -f "$PID_FILE" ]; then
echo "程序正在運(yùn)行,PID=$(cat $PID_FILE)"
else
echo "程序未運(yùn)行"
fi
- 通過(guò)檢查
$PID_FILE是否存在來(lái)判斷程序是否正在運(yùn)行,并顯示當(dāng)前進(jìn)程的 PID。
5.restart部分
$0 stop $0 start
restart通過(guò)調(diào)用腳本自身的stop和start操作來(lái)重啟程序。$0表示腳本本身。
6. 默認(rèn)提示
echo "用法: $0 {start|stop|restart|status}"
- 如果腳本傳入了不正確的參數(shù),輸出如何使用腳本的提示信息。
四、腳本的使用方法
1. 創(chuàng)建腳本
將腳本內(nèi)容保存為 app.sh 文件。
2. 賦予執(zhí)行權(quán)限
chmod +x app.sh
3. 運(yùn)行腳本
啟動(dòng)程序:
./app.sh start
停止程序:
./app.sh stop
查看程序狀態(tài):
./app.sh status
重啟程序:
./app.sh restart
五、補(bǔ)充:增強(qiáng)功能
- 加入日志清理
可以在腳本中加入日志清理功能,在程序啟動(dòng)或重啟時(shí),將舊的日志文件重命名并保存,以便后續(xù)查看:
[ -f "$LOG_FILE" ] && mv $LOG_FILE "$LOG_FILE.$(date +%Y%m%d%H%M%S)"
- 支持自定義參數(shù)
可以通過(guò)傳入命令行參數(shù)來(lái)動(dòng)態(tài)指定 JAR 文件名或 JVM 參數(shù)。例如:
APP_NAME=${2:-"myapp-1.0.jar"}
- 啟動(dòng)失敗檢測(cè)
啟動(dòng)程序后,可以檢測(cè)程序是否成功啟動(dòng)。如果程序未啟動(dòng)成功,可以輸出錯(cuò)誤信息并退出:
if ! ps -p $(cat $PID_FILE) > /dev/null; then
echo "啟動(dòng)失敗!"
rm -f $PID_FILE
exit 1
fi
到此這篇關(guān)于Shell 腳本管理 Java 程序的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Shell 腳本管理Java 程序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
shell產(chǎn)生隨機(jī)數(shù)七種方法的實(shí)現(xiàn)
這篇文章主要介紹了shell產(chǎn)生隨機(jī)數(shù)七種方法的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
jenkins+shell自動(dòng)化部署的實(shí)現(xiàn)步驟
本文主要介紹了jenkins+shell自動(dòng)化部署的實(shí)現(xiàn)步驟,通過(guò)jenkins與shell腳本相結(jié)合,實(shí)現(xiàn)war包自動(dòng)部署到多臺(tái)服務(wù)器上,感興趣的可以了解一下2022-04-04
Shell編程之/bin/bash和/bin/sh的區(qū)別淺析
在redhat的系統(tǒng)中,sh是一個(gè)到bash的軟鏈接,但是如果運(yùn)行如下程序會(huì)產(chǎn)生不一樣的結(jié)果,下面這篇文章主要給大家介紹了關(guān)于Shell編程之/bin/bash和/bin/sh的區(qū)別的相關(guān)資料,需要的朋友可以參考下2022-07-07
Centos下查看網(wǎng)卡的實(shí)時(shí)流量命令
本文介紹了linux下查看網(wǎng)卡流量的六種方法,linux系統(tǒng)中使用nload、iftop、iostat等工具查看網(wǎng)卡流量,這里我們先來(lái)詳細(xì)講解下 iptraf 方法,需要的朋友參考下。2015-05-05
shell腳本實(shí)現(xiàn)linux系統(tǒng)文件完整性檢測(cè)
這篇文章主要介紹了shell腳本實(shí)現(xiàn)linux系統(tǒng)文件完整性檢測(cè),本文給出的腳本使用對(duì)比MD5的方法,檢測(cè)linux系統(tǒng)文件是否被替換等問(wèn)題,需要的朋友可以參考下2014-12-12
通過(guò)Spring Shell 開(kāi)發(fā) Java 命令行應(yīng)用
這篇文章主要介紹了通過(guò)Spring Shell 開(kāi)發(fā) Java 命令行應(yīng)用的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-11-11

