Shell腳本管理Java應(yīng)用程序的高效方法
腳本功能概述
本腳本提供以下主要功能:
- 檢查 JAR 包的運行狀態(tài)
- 啟動尚未運行的 JAR 包
- 停止所有運行中的 JAR 包
- 刪除 10 天之前的舊日志,并壓縮近期日志
詳細代碼講解
以下是腳本的主要部分,我們將逐段分析其實現(xiàn)邏輯。
創(chuàng)建日志目錄:
# 創(chuàng)建日志目錄 [ ! -d "./logs" ] && mkdir ./logs
此部分確保在腳本運行時創(chuàng)建一個日志目錄,以便存儲后續(xù)生成的日志文件。
檢查進程狀態(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ù)未啟動" else echo "$filename: 該服務(wù)正在運行 (PID為: $pid)" fi done }
該函數(shù)循環(huán)遍歷當前目錄下的所有 JAR 包,使用
ps
命令檢查它們的運行狀態(tài)。如果沒有找到相應(yīng)的 PID,則表示服務(wù)未啟動。日志清理與壓縮:
# 刪除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)的老日志文件" }
這兩部分負責(zé)清理和壓縮日志文件,確保日志目錄不會占用過多空間,保持整潔。
停止進程:
stop_all() { for filename in $filenames; do echo -e "\n------------------------------------------------------" echo "嘗試優(yōu)雅停止 $filename 進程" ps -ef | grep $filename | grep -v grep | awk '{print $2}' | xargs --no-run-if-empty kill sleep 3 echo "檢查是否有未終止的 $filename 進程,強制結(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)雅地停止所有進程,如果未能成功,則強制結(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)、啟動或停止服務(wù)。
使用示例
要使用該腳本,可以在終端中運行以下命令:
- 重啟所有JAR包:
./your_script.sh
- 查看 JAR 包狀態(tài):
./your_script.sh status
- 啟動未運行的 JAR 包:
./your_script.sh free
- 停止所有 JAR 包:
./your_script.sh stop
注意事項
在運行腳本之前,請確保您擁有足夠的權(quán)限,并檢查腳本中的路徑設(shè)置,避免權(quán)限或路徑錯誤導(dǎo)致的運行失敗。
總結(jié)
通過這個簡單的 Shell 腳本,您可以高效地管理 Java 應(yīng)用程序的運行狀態(tài),確保日志文件的整潔。希望您能根據(jù)自己的需求進行修改和擴展,讓腳本更符合您的工作流程。
附錄完整代碼
完整代碼:
#!/bin/bash # 創(chuàng)建日志目錄 [ ! -d "./logs" ] && mkdir ./logs # 獲取當前目錄下所有的 jar 文件名 filenames=$(ls *.jar) echo "獲取當前目錄下所有的 jar 包文件名" # 定義函數(shù):檢查進程狀態(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ù)未啟動" else echo "$filename: 該服務(wù)正在運行 (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ù):停止所有進程 stop_all() { for filename in $filenames; do echo -e "\n------------------------------------------------------" echo "嘗試優(yōu)雅停止 $filename 進程" ps -ef | grep $filename | grep -v grep | awk '{print $2}' | xargs --no-run-if-empty kill sleep 3 echo "檢查是否有未終止的 $filename 進程,強制結(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 查看當前文件夾下所有jar運行狀態(tài)" check_status ;; free) echo "后綴free 啟動尚未啟動的 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 "開始啟動 $filename" nohup java -server -Xms1024m -Xmx1024m -XX:MetaspaceSize=200m -jar $filename >> ./logs/outlog_${logname}_$timestamp.log 2>&1 & echo "啟動 $filename 結(jié)束,日志輸出到 ./logs/outlog_${logname}_$timestamp.log" else echo "$filename: 已在運行,跳過啟動" fi done ;; stop) stop_all ;; *) echo "進行默認選項,重新啟動所有 jar 包(可通過status后綴查看狀態(tài)、free啟動未運行jar服務(wù),stop停止當前目錄下所有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 "開始啟動 $filename" nohup java -server -Xms1024m -Xmx1024m -XX:MetaspaceSize=200m -jar $filename >> ./logs/outlog_${logname}_$timestamp.log 2>&1 & sleep 2 echo "啟動 $filename 結(jié)束,日志輸出到 ./logs/outlog_${logname}_$timestamp.log" done ;; esac
以上就是Shell腳本管理Java應(yīng)用程序的高效方法的詳細內(nèi)容,更多關(guān)于Shell腳本管理Java程序的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java 把json對象轉(zhuǎn)成map鍵值對的方法
這篇文章主要介紹了java 把json對象中轉(zhuǎn)成map鍵值對的方法,本文的目的是把json串轉(zhuǎn)成map鍵值對存儲,而且只存儲葉節(jié)點的數(shù)據(jù) 。需要的朋友可以參考下2018-04-04springboot單獨使用feign簡化接口調(diào)用方式
這篇文章主要介紹了springboot單獨使用feign簡化接口調(diào)用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03springboot引入遠程nacos配置文件錯誤的解決方案
本文為解決Spring Cloud Alibaba中配置導(dǎo)入問題,提供了詳細的步驟說明,包括引入依賴、配置nacos、創(chuàng)建bootstrap.yml文件以及測試配置導(dǎo)入是否成功的方法,幫助開發(fā)者快速解決相關(guān)問題2024-09-09Spring?MVC文件請求處理MultipartResolver詳解
這篇文章主要介紹了Spring?MVC文件請求處理詳解:MultipartResolver,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-11-11Java中提供synchronized后為什么還要提供Lock
這篇文章主要介紹了Java中提供synchronized后為什么還要提供Lock,在Java中提供了synchronized關(guān)鍵字來保證只有一個線程能夠訪問同步代碼塊,下文更多相關(guān)資料需要的小伙伴可以參考一下2022-03-03