使用 Shell 脚本管理 Java 应用程序

使用 Shell 脚本管理 Java 应用程序

在现代软件开发中,使用脚本来管理应用程序的启动、停止和监控变得越来越重要。本文将详细解析一个用于管理 Java 应用程序的 Bash 脚本,帮助读者理解其功能和实现细节。

脚本概述

这个 Bash 脚本的主要功能是启动、停止、重启和检查一个 Java 应用程序的状态。脚本中使用了 Java 进程的相关命令和参数,确保应用能够在指定的环境中运行。

脚本内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#!/bin/bash

# 定义变量
MEMORY_SIZE="4096m" # 占用内存大小
PROCESS_NAME="yudao-server.jar" # 进程名称
ROOT_PATH="/home/lbs/project/ruoyi-pro" # 项目根路径
GC_LOG_PATH="${ROOT_PATH}/backend/logs/service-gc.log" # jvm gc日志路径
HEAP_DUMP_PATH="${ROOT_PATH}/backend/logs" # oom dump文件路径
JAR_PATH="${ROOT_PATH}/backend/jar/yudao-server.jar" # jar包路径

start() {
# 检查是否有相同的进程在运行
if pgrep -f "${PROCESS_NAME}" > /dev/null; then
echo "应用已经在运行。"
exit 1
fi

nohup java \
-Xms"${MEMORY_SIZE}" -Xmx"${MEMORY_SIZE}" \
-Xloggc:"${GC_LOG_PATH}" \
-verbose:gc \
-XX:+PrintGCDetails \
-XX:+PrintGCDateStamps \
-XX:+PrintGCTimeStamps \
-XX:+UseGCLogFileRotation \
-XX:NumberOfGCLogFiles=10 \
-XX:GCLogFileSize=100M \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=${HEAP_DUMP_PATH} \
-server \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=20 \
-XX:InitiatingHeapOccupancyPercent=35 \
-XX:+ExplicitGCInvokesConcurrent \
-XX:MaxInlineLevel=15 \
-Djava.awt.headless=true \
-jar "${JAR_PATH}" >/dev/null 2>&1 &

echo "应用已启动。"
}

stop() {
PIDS=$(pgrep -f "${PROCESS_NAME}")

if [ -n "${PIDS}" ]; then
for pid in ${PIDS}; do
echo "正在停止进程,PID: ${pid}"
kill ${pid}
done

# 等待进程停止
for pid in ${PIDS}; do
while kill -0 ${pid} 2>/dev/null; do
echo "正在停止应用,PID: ${pid}"
sleep 1
done
done

echo "应用已停止。"
else
echo "未找到正在运行的应用。"
fi
}

restart() {
stop
start
}

status() {
PIDS=$(pgrep -f "${PROCESS_NAME}")

if [ -n "${PIDS}" ]; then
for pid in ${PIDS}; do
START_TIME=$(ps -o lstart= -p ${pid})
RUNNING_TIME=$(ps -o etime= -p ${pid})
USER=$(ps -o user= -p ${pid})

echo "应用正在运行:"
echo "PID: ${pid}"
echo "启动时间: ${START_TIME}"
echo "启动用户: ${USER}"
echo "运行时长: ${RUNNING_TIME}"
done
else
echo "应用未在运行。"
fi
}

help() {
echo "用法: $0 {start|stop|restart|status|--help}"
echo ""
echo "命令:"
echo " start 启动应用"
echo " stop 停止应用"
echo " restart 重启应用"
echo " status 查看应用状态"
echo " --help 显示帮助信息"
}

case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status
;;
--help)
help
;;
*)
echo "用法: $0 {start|stop|restart|status|--help}"
exit 1
;;
esac

脚本解析

变量定义

在脚本的开头,定义了一些关键变量:

1
2
3
4
5
PROCESS_NAME="yudao-server.jar" # 进程名称
ROOT_PATH="/home/lbs/project/ruoyi-pro" # 项目根路径
GC_LOG_PATH="${ROOT_PATH}/backend/logs/service-gc.log" # jvm gc日志路径
HEAP_DUMP_PATH="${ROOT_PATH}/backend/logs" # oom dump文件路径
JAR_PATH="${ROOT_PATH}/backend/jar/yudao-server.jar" # jar包路径

这些变量提供了应用程序所需的基本信息,例如项目环境、进程名称和日志路径等。

启动应用程序

start 函数负责启动 Java 应用程序。首先,它检查是否已有相同的进程在运行:

1
2
3
4
if pgrep -f "${PROCESS_NAME}" > /dev/null; then
echo "应用已经在运行。"
exit 1
fi

如果应用未在运行,使用 nohup 命令启动 Java 应用,并传递了一些 JVM 参数和 Spring 配置:

1
nohup java xxxxxx -jar  ...

这些参数包括内存设置、垃圾回收策略、GC 日志配置等,以优化应用的性能和稳定性。

停止应用程序

stop 函数用于停止正在运行的应用程序。它通过 pgrep 获取进程 ID(PID),并使用 kill 命令停止进程:

1
PIDS=$(pgrep -f "${PROCESS_NAME}")

如果找到进程,脚本会逐个停止它们,并在停止过程中输出相关信息:

1
2
3
4
for pid in ${PIDS}; do
echo "正在停止进程,PID: ${pid}"
kill ${pid}
done

重启和状态检查

restart 函数简单地调用 stopstart 函数实现重启功能。而 status 函数则用于检查应用程序的当前状态:

1
2
3
4
5
6
7
8
9
10
if [ -n "${PIDS}" ]; then
for pid in ${PIDS}; do
START_TIME=$(ps -o lstart= -p ${pid})
RUNNING_TIME=$(ps -o etime= -p ${pid})
USER=$(ps -o user= -p ${pid})
...
done
else
echo "应用未在运行。"
fi

该函数输出每个运行中的进程的 PID、启动时间、运行时长和用户信息。

帮助信息

最后,脚本提供了帮助信息,指导用户如何使用这些命令:

1
2
3
4
help() {
echo "用法: $0 {start|stop|restart|status|--help}"
...
}

友情提醒

请注意,由于脚本是通过 JAR 包名称来查找进程的,这可能会导致误杀其他同名进程。在使用时,请确保处理好相关问题,以避免不必要的影响。

总结

这个 Bash 脚本为 Java 应用程序提供了一个简单而有效的管理工具。通过使用脚本,开发者可以方便地控制应用程序的生命周期,同时也能实时监控应用的状态。这种自动化的管理方式提高了开发和运维的效率,是现代应用管理中不可或缺的一部分。

希望这篇文章能帮助你更好地理解和使用 Bash 脚本来管理 Java 应用程序!

使用 Shell 脚本管理 Java 应用程序

https://lbs.wiki/pages/adfad19/

作者

李博帅

发布于

2024-11-14

更新于

2025-06-05

许可协议