亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Shell腳本管理Java應(yīng)用程序的高效方法

 更新時(shí)間:2024年09月29日 10:15:59   作者:不掉頭發(fā)的阿水  
在軟件開發(fā)中,管理和監(jiān)控 Java 應(yīng)用程序的運(yùn)行狀態(tài)變得愈加重要,本文將分享一個(gè)自用的簡(jiǎn)單但高效的 Shell 腳本,幫助輕松管理 JAR 包的啟動(dò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)。如果沒有找到相應(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ì)占用過多空間,保持整潔。

  • 停止進(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é)

通過這個(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)行,跳過啟動(dòng)"
            fi
        done
        ;;
    stop)
        stop_all
        ;;
    *)
        echo "進(jìn)行默認(rèn)選項(xiàng),重新啟動(dòng)所有 jar 包(可通過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 把json對(duì)象轉(zhuǎn)成map鍵值對(duì)的方法

    Java 把json對(duì)象轉(zhuǎn)成map鍵值對(duì)的方法

    這篇文章主要介紹了java 把json對(duì)象中轉(zhuǎn)成map鍵值對(duì)的方法,本文的目的是把json串轉(zhuǎn)成map鍵值對(duì)存儲(chǔ),而且只存儲(chǔ)葉節(jié)點(diǎn)的數(shù)據(jù) 。需要的朋友可以參考下
    2018-04-04
  • Java中LocalCache本地緩存實(shí)現(xiàn)代碼

    Java中LocalCache本地緩存實(shí)現(xiàn)代碼

    本篇文章主要介紹了Java中LocalCache本地緩存實(shí)現(xiàn)代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • springboot單獨(dú)使用feign簡(jiǎn)化接口調(diào)用方式

    springboot單獨(dú)使用feign簡(jiǎn)化接口調(diào)用方式

    這篇文章主要介紹了springboot單獨(dú)使用feign簡(jiǎn)化接口調(diào)用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • springboot引入遠(yuǎn)程nacos配置文件錯(cuò)誤的解決方案

    springboot引入遠(yuǎn)程nacos配置文件錯(cuò)誤的解決方案

    本文為解決Spring Cloud Alibaba中配置導(dǎo)入問題,提供了詳細(xì)的步驟說明,包括引入依賴、配置nacos、創(chuàng)建bootstrap.yml文件以及測(cè)試配置導(dǎo)入是否成功的方法,幫助開發(fā)者快速解決相關(guān)問題
    2024-09-09
  • Java動(dòng)態(tài)代理四種實(shí)現(xiàn)方式詳解

    Java動(dòng)態(tài)代理四種實(shí)現(xiàn)方式詳解

    這篇文章主要介紹了Java四種動(dòng)態(tài)代理實(shí)現(xiàn)方式,對(duì)于開始學(xué)習(xí)java動(dòng)態(tài)代理或者要復(fù)習(xí)java動(dòng)態(tài)代理的朋友來講很有參考價(jià)值,有感興趣的朋友可以參考一下
    2021-04-04
  • Spring?MVC文件請(qǐng)求處理MultipartResolver詳解

    Spring?MVC文件請(qǐng)求處理MultipartResolver詳解

    這篇文章主要介紹了Spring?MVC文件請(qǐng)求處理詳解:MultipartResolver,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-11-11
  • Java中提供synchronized后為什么還要提供Lock

    Java中提供synchronized后為什么還要提供Lock

    這篇文章主要介紹了Java中提供synchronized后為什么還要提供Lock,在Java中提供了synchronized關(guān)鍵字來保證只有一個(gè)線程能夠訪問同步代碼塊,下文更多相關(guān)資料需要的小伙伴可以參考一下
    2022-03-03
  • Gradle構(gòu)建多模塊項(xiàng)目的方法步驟

    Gradle構(gòu)建多模塊項(xiàng)目的方法步驟

    這篇文章主要介紹了Gradle構(gòu)建多模塊項(xiàng)目的方法步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-05-05
  • Springboot整合Redis的詳細(xì)教程分享

    Springboot整合Redis的詳細(xì)教程分享

    這篇文章主要為大家詳細(xì)介紹了如何利用SpringBoot整合Redis,文中的示例代碼講解詳細(xì),具有很好的參考價(jià)值,希望對(duì)大家有所幫助
    2022-08-08
  • 使用MyBatis快速生成代碼的幾種方法

    使用MyBatis快速生成代碼的幾種方法

    本文主要介紹了如何使用MyBatis快速生成代碼的幾種方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2023-12-12

最新評(píng)論