Shell腳本管理Java應(yīng)用程序的高效方法
腳本功能概述
本腳本提供以下主要功能:
- 檢查 JAR 包的運(yùn)行狀態(tài)
- 啟動(dòng)尚未運(yùn)行的 JAR 包
- 停止所有運(yùn)行中的 JAR 包
- 刪除 10 天之前的舊日志,并壓縮近期日志
詳細(xì)代碼講解
以下是腳本的主要部分,我們將逐段分析其實(shí)現(xiàn)邏輯。
創(chuàng)建日志目錄:
# 創(chuàng)建日志目錄 [ ! -d "./logs" ] && mkdir ./logs
此部分確保在腳本運(yùn)行時(shí)創(chuàng)建一個(gè)日志目錄,以便存儲(chǔ)后續(xù)生成的日志文件。
檢查進(jìn)程狀態(tài):
check_status() {
for filename in $filenames; do
pid=$(ps -ef | grep $filename | grep -v grep | awk '{print $2}')
if [ -z "$pid" ]; then
echo "$filename: 該服務(wù)未啟動(dòng)"
else
echo "$filename: 該服務(wù)正在運(yùn)行 (PID為: $pid)"
fi
done
}該函數(shù)循環(huán)遍歷當(dāng)前目錄下的所有 JAR 包,使用
ps命令檢查它們的運(yùn)行狀態(tài)。如果沒(méi)有找到相應(yīng)的 PID,則表示服務(wù)未啟動(dòng)。日志清理與壓縮:
# 刪除10天之前的日志文件
delete_old_logs() {
find ./logs -type f -name "*.log" -mtime +10 -exec rm {} \;
echo "已刪除10天之前的日志文件"
}
# 壓縮10天內(nèi)的老日志
compress_old_logs() {
find ./logs -type f -name "*.log" -mtime -10 -exec gzip {} \;
echo "已壓縮10天內(nèi)的老日志文件"
}這兩部分負(fù)責(zé)清理和壓縮日志文件,確保日志目錄不會(huì)占用過(guò)多空間,保持整潔。
停止進(jìn)程:
stop_all() {
for filename in $filenames; do
echo -e "\n------------------------------------------------------"
echo "嘗試優(yōu)雅停止 $filename 進(jìn)程"
ps -ef | grep $filename | grep -v grep | awk '{print $2}' | xargs --no-run-if-empty kill
sleep 3
echo "檢查是否有未終止的 $filename 進(jìn)程,強(qiáng)制結(jié)束"
ps -ef | grep java | grep $filename | grep -v grep | awk '{print $2}' | xargs -r kill -9
echo "$filename 程序已經(jīng)停止"
done
}stop_all函數(shù)嘗試優(yōu)雅地停止所有進(jìn)程,如果未能成功,則強(qiáng)制結(jié)束它們,確保所有服務(wù)都已停止。腳本參數(shù)處理:
case "$1" in
status)
check_status
;;
free)
for filename in $filenames; do
...
done
;;
stop)
stop_all
;;
*)
...
;;
esac此部分根據(jù)用戶輸入的參數(shù)執(zhí)行不同的操作,如查看狀態(tài)、啟動(dòng)或停止服務(wù)。
使用示例
要使用該腳本,可以在終端中運(yùn)行以下命令:
- 重啟所有JAR包:
./your_script.sh - 查看 JAR 包狀態(tài):
./your_script.sh status - 啟動(dòng)未運(yùn)行的 JAR 包:
./your_script.sh free - 停止所有 JAR 包:
./your_script.sh stop
注意事項(xiàng)
在運(yùn)行腳本之前,請(qǐng)確保您擁有足夠的權(quán)限,并檢查腳本中的路徑設(shè)置,避免權(quán)限或路徑錯(cuò)誤導(dǎo)致的運(yùn)行失敗。
總結(jié)
通過(guò)這個(gè)簡(jiǎn)單的 Shell 腳本,您可以高效地管理 Java 應(yīng)用程序的運(yùn)行狀態(tài),確保日志文件的整潔。希望您能根據(jù)自己的需求進(jìn)行修改和擴(kuò)展,讓腳本更符合您的工作流程。
附錄完整代碼
完整代碼:
#!/bin/bash
# 創(chuàng)建日志目錄
[ ! -d "./logs" ] && mkdir ./logs
# 獲取當(dāng)前目錄下所有的 jar 文件名
filenames=$(ls *.jar)
echo "獲取當(dāng)前目錄下所有的 jar 包文件名"
# 定義函數(shù):檢查進(jìn)程狀態(tài)
check_status() {
for filename in $filenames; do
pid=$(ps -ef | grep $filename | grep -v grep | awk '{print $2}')
if [ -z "$pid" ]; then
echo "$filename: 該服務(wù)未啟動(dòng)"
else
echo "$filename: 該服務(wù)正在運(yùn)行 (PID為: $pid)"
fi
done
}
# 刪除10天之前的日志文件
delete_old_logs() {
find ./logs -type f -name "*.log" -mtime +10 -exec rm {} \;
echo "已刪除10天之前的日志文件"
}
# 壓縮10天內(nèi)的老日志
compress_old_logs() {
find ./logs -type f -name "*.log" -mtime -10 -exec gzip {} \;
echo "已壓縮10天內(nèi)的老日志文件"
}
# 定義函數(shù):停止所有進(jìn)程
stop_all() {
for filename in $filenames; do
echo -e "\n------------------------------------------------------"
echo "嘗試優(yōu)雅停止 $filename 進(jìn)程"
ps -ef | grep $filename | grep -v grep | awk '{print $2}' | xargs --no-run-if-empty kill
sleep 3
echo "檢查是否有未終止的 $filename 進(jìn)程,強(qiáng)制結(jié)束"
ps -ef | grep java | grep $filename | grep -v grep | awk '{print $2}' | xargs -r kill -9
echo "$filename 程序已經(jīng)停止"
done
}
# 判斷腳本參數(shù)
case "$1" in
status)
echo "后綴status 查看當(dāng)前文件夾下所有jar運(yùn)行狀態(tài)"
check_status
;;
free)
echo "后綴free 啟動(dòng)尚未啟動(dòng)的 jar 包"
for filename in $filenames; do
pid=$(ps -ef | grep $filename | grep -v grep | awk '{print $2}')
if [ -z "$pid" ]; then
logname=$(basename $filename .jar)
timestamp=$(date +"%Y%m%d_%H%M%S")
echo "開始啟動(dòng) $filename"
nohup java -server -Xms1024m -Xmx1024m -XX:MetaspaceSize=200m -jar $filename >> ./logs/outlog_${logname}_$timestamp.log 2>&1 &
echo "啟動(dòng) $filename 結(jié)束,日志輸出到 ./logs/outlog_${logname}_$timestamp.log"
else
echo "$filename: 已在運(yùn)行,跳過(guò)啟動(dòng)"
fi
done
;;
stop)
stop_all
;;
*)
echo "進(jìn)行默認(rèn)選項(xiàng),重新啟動(dòng)所有 jar 包(可通過(guò)status后綴查看狀態(tài)、free啟動(dòng)未運(yùn)行jar服務(wù),stop停止當(dāng)前目錄下所有jar包服務(wù))"
stop_all
# 執(zhí)行日志清理和壓縮
delete_old_logs
compress_old_logs
for filename in $filenames; do
sleep 2
logname=$(basename $filename .jar)
timestamp=$(date +"%Y%m%d_%H%M%S")
echo "開始啟動(dòng) $filename"
nohup java -server -Xms1024m -Xmx1024m -XX:MetaspaceSize=200m -jar $filename >> ./logs/outlog_${logname}_$timestamp.log 2>&1 &
sleep 2
echo "啟動(dòng) $filename 結(jié)束,日志輸出到 ./logs/outlog_${logname}_$timestamp.log"
done
;;
esac


以上就是Shell腳本管理Java應(yīng)用程序的高效方法的詳細(xì)內(nèi)容,更多關(guān)于Shell腳本管理Java程序的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java獲取Object中Value的實(shí)現(xiàn)方法
本文介紹了在Java中獲取對(duì)象屬性值的幾種常見(jiàn)方法,包括使用反射機(jī)制、getter方法、接口或抽象類、Map數(shù)據(jù)結(jié)構(gòu)、序列化與反序列化以及JavaBeans規(guī)范,每種方法都有其適用場(chǎng)景和優(yōu)缺點(diǎn),選擇合適的方法取決于具體需求2025-03-03
詳解Java中如何定義和訪問(wèn)靜態(tài)字段和方法
在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,我們通常使用類來(lái)創(chuàng)建對(duì)象,類中有許多成員變量和方法,它們是直接屬于對(duì)象實(shí)例的,與之對(duì)應(yīng)的還有一類成員,那就是靜態(tài)成員,本文就來(lái)和大家聊聊Java是如何定義訪問(wèn)靜態(tài)成員的吧2023-05-05
Java MyBatis返回兩個(gè)字段作為Map的key和value問(wèn)題
使用MyBatis查詢兩個(gè)字段并返回Map時(shí),需要注意數(shù)據(jù)量和值的類型,直接返回Map會(huì)導(dǎo)致報(bào)錯(cuò),使用@MapKey注解可以生成Map,但值是對(duì)象而不是直接值,為了解決這個(gè)問(wèn)題,可以自定義一個(gè)Map結(jié)果處理器MapResultHandler2024-12-12
Java處理JSON編程實(shí)用技巧和性能優(yōu)化
JSON解析是Java Web開發(fā)的核心技能,用于服務(wù)端和客戶端間數(shù)據(jù)交換,下面這篇文章主要介紹了Java處理JSON編程實(shí)用技巧和性能優(yōu)化的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-11-11
淺談為什么Java中1000==1000為false而100==100為true
這篇文章主要介紹了淺談為什么Java中1000==1000為false而100==100為true,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
詳細(xì)說(shuō)一說(shuō)Java自動(dòng)裝箱與拆箱是什么
自動(dòng)裝箱與拆箱的機(jī)制可以讓我們?cè)贘ava的變量賦值或者是方法調(diào)用等情況下使用原始類型或者對(duì)象類型更加簡(jiǎn)單直接,這篇文章主要介紹了Java自動(dòng)裝箱與拆箱是什么的相關(guān)資料,需要的朋友可以參考下2025-10-10
Spring Boot Logback配置日志過(guò)程解析
這篇文章主要介紹了Spring Boot Logback配置日志過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10

