Shell脚本管理Java应用程序的高效方法
作者:不掉头发的阿水
在软件开发中,管理和监控 Java 应用程序的运行状态变得愈加重要,本文将分享一个自用的简单但高效的 Shell 脚本,帮助轻松管理 JAR 包的启动、停止和日志管理,需要的朋友可以参考下
脚本功能概述
本脚本提供以下主要功能:
- 检查 JAR 包的运行状态
- 启动尚未运行的 JAR 包
- 停止所有运行中的 JAR 包
- 删除 10 天之前的旧日志,并压缩近期日志
详细代码讲解
以下是脚本的主要部分,我们将逐段分析其实现逻辑。
创建日志目录:
# 创建日志目录 [ ! -d "./logs" ] && mkdir ./logs
此部分确保在脚本运行时创建一个日志目录,以便存储后续生成的日志文件。
检查进程状态:
check_status() { for filename in $filenames; do pid=$(ps -ef | grep $filename | grep -v grep | awk '{print $2}') if [ -z "$pid" ]; then echo "$filename: 该服务未启动" else echo "$filename: 该服务正在运行 (PID为: $pid)" fi done }
该函数循环遍历当前目录下的所有 JAR 包,使用
ps
命令检查它们的运行状态。如果没有找到相应的 PID,则表示服务未启动。日志清理与压缩:
# 删除10天之前的日志文件 delete_old_logs() { find ./logs -type f -name "*.log" -mtime +10 -exec rm {} \; echo "已删除10天之前的日志文件" } # 压缩10天内的老日志 compress_old_logs() { find ./logs -type f -name "*.log" -mtime -10 -exec gzip {} \; echo "已压缩10天内的老日志文件" }
这两部分负责清理和压缩日志文件,确保日志目录不会占用过多空间,保持整洁。
停止进程:
stop_all() { for filename in $filenames; do echo -e "\n------------------------------------------------------" echo "尝试优雅停止 $filename 进程" ps -ef | grep $filename | grep -v grep | awk '{print $2}' | xargs --no-run-if-empty kill sleep 3 echo "检查是否有未终止的 $filename 进程,强制结束" ps -ef | grep java | grep $filename | grep -v grep | awk '{print $2}' | xargs -r kill -9 echo "$filename 程序已经停止" done }
stop_all
函数尝试优雅地停止所有进程,如果未能成功,则强制结束它们,确保所有服务都已停止。脚本参数处理:
case "$1" in status) check_status ;; free) for filename in $filenames; do ... done ;; stop) stop_all ;; *) ... ;; esac
此部分根据用户输入的参数执行不同的操作,如查看状态、启动或停止服务。
使用示例
要使用该脚本,可以在终端中运行以下命令:
- 重启所有JAR包:
./your_script.sh
- 查看 JAR 包状态:
./your_script.sh status
- 启动未运行的 JAR 包:
./your_script.sh free
- 停止所有 JAR 包:
./your_script.sh stop
注意事项
在运行脚本之前,请确保您拥有足够的权限,并检查脚本中的路径设置,避免权限或路径错误导致的运行失败。
总结
通过这个简单的 Shell 脚本,您可以高效地管理 Java 应用程序的运行状态,确保日志文件的整洁。希望您能根据自己的需求进行修改和扩展,让脚本更符合您的工作流程。
附录完整代码
完整代码:
#!/bin/bash # 创建日志目录 [ ! -d "./logs" ] && mkdir ./logs # 获取当前目录下所有的 jar 文件名 filenames=$(ls *.jar) echo "获取当前目录下所有的 jar 包文件名" # 定义函数:检查进程状态 check_status() { for filename in $filenames; do pid=$(ps -ef | grep $filename | grep -v grep | awk '{print $2}') if [ -z "$pid" ]; then echo "$filename: 该服务未启动" else echo "$filename: 该服务正在运行 (PID为: $pid)" fi done } # 删除10天之前的日志文件 delete_old_logs() { find ./logs -type f -name "*.log" -mtime +10 -exec rm {} \; echo "已删除10天之前的日志文件" } # 压缩10天内的老日志 compress_old_logs() { find ./logs -type f -name "*.log" -mtime -10 -exec gzip {} \; echo "已压缩10天内的老日志文件" } # 定义函数:停止所有进程 stop_all() { for filename in $filenames; do echo -e "\n------------------------------------------------------" echo "尝试优雅停止 $filename 进程" ps -ef | grep $filename | grep -v grep | awk '{print $2}' | xargs --no-run-if-empty kill sleep 3 echo "检查是否有未终止的 $filename 进程,强制结束" ps -ef | grep java | grep $filename | grep -v grep | awk '{print $2}' | xargs -r kill -9 echo "$filename 程序已经停止" done } # 判断脚本参数 case "$1" in status) echo "后缀status 查看当前文件夹下所有jar运行状态" 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 结束,日志输出到 ./logs/outlog_${logname}_$timestamp.log" else echo "$filename: 已在运行,跳过启动" fi done ;; stop) stop_all ;; *) echo "进行默认选项,重新启动所有 jar 包(可通过status后缀查看状态、free启动未运行jar服务,stop停止当前目录下所有jar包服务)" stop_all # 执行日志清理和压缩 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 结束,日志输出到 ./logs/outlog_${logname}_$timestamp.log" done ;; esac
以上就是Shell脚本管理Java应用程序的高效方法的详细内容,更多关于Shell脚本管理Java程序的资料请关注脚本之家其它相关文章!