概述
最近要给客户私有化部署,由于服务器资源有限,没法使用docker或k8s部署,只能使用Jar包启动方式管理Spring Boot应用程序的启动、停止、重启和状态检查。脚本通过PID文件管理进程,支持在后台和终端两种模式下运行应用程序。本人是后端开发,对shell脚本不是太精通就一边写脚本一边让ChatGpt帮忙优化,结果出乎意料。细节优化的太到位了。
脚本内容
#!/bin/bash
# Spring Boot应用程序的名称
APP_BASE_NAME="you-app-name"
# PID目录
RUN_DIR="you-app-run-dir"
# 获取脚本所在目录
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
# 检查Spring Boot应用程序是否正在运行
is_running() {
if [ -f "$PID_FILE" ]; then
PID=$(cat "$PID_FILE")
if [ -n "$PID" ] && ps -p "$PID" > /dev/null 2>&1; then
return 0
fi
fi
return 1
}
# 启动Spring Boot应用程序
start() {
if is_running; then
echo "$APP_NAME is already running."
else
echo "Starting $APP_NAME..."
CMD="nohup java -Dlogging.config="$LOGBACK_PATH" -jar "$JAR_PATH" --spring.profiles.active="$ENV" >/dev/null 2>&1 &"
echo $CMD
eval $CMD
echo $! > "$PID_FILE"
echo "$APP_NAME started."
fi
}
# 以终端打印日志的方式启动Spring Boot应用程序
starting() {
if is_running; then
echo "$APP_NAME is already running."
else
echo "Starting $APP_NAME and logging to terminal..."
CMD="java -Dlogging.config="$LOGBACK_PATH" -jar "$JAR_PATH" --spring.profiles.active="$ENV""
echo $CMD
eval $CMD
fi
}
# 停止Spring Boot应用程序
stop() {
if is_running; then
PID=$(cat "$PID_FILE")
kill "$PID"
# 等待进程完全退出
while is_running; do
echo "Waiting for $APP_NAME to stop..."
sleep 1
done
rm -f "$PID_FILE"
echo "$APP_NAME stopped."
else
echo "$APP_NAME is not running."
fi
}
# 重启Spring Boot应用程序
restart() {
stop
start
}
# 查看Spring Boot应用程序状态
status() {
if is_running; then
PID=$(cat "$PID_FILE")
echo "$APP_NAME is running (PID: $PID)."
else
echo "$APP_NAME is not running."
fi
}
# 显示帮助信息
help() {
echo "Usage: $0 <jar_path> <env> <logback_path> {start|stop|restart|status|starting|help}"
echo
echo "Commands:"
echo " start Start the Spring Boot application"
echo " stop Stop the Spring Boot application"
echo " restart Restart the Spring Boot application"
echo " status Show the status of the Spring Boot application"
echo " starting Start the Spring Boot application and log to terminal"
echo " help Show this help message"
echo
echo "Environment:"
echo " env The environment configuration to use (e.g., pre, prod)"
echo " logback_path The path to the logback configuration file"
}
# 脚本的主入口
if [ $# -lt 4 ]; then
help
exit 1
fi
JAR_PATH=$1
ENV=$2
LOGBACK_PATH=$3
APP_NAME="${APP_BASE_NAME}-${ENV}"
PID_FILE="$RUN_DIR/$APP_NAME.pid"
shift 3
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status
;;
starting)
starting
;;
help)
help
;;
*)
help
exit 1
;;
esac
exit 0
脚本参数
脚本需要传入以下参数:
- JAR_PATH:Spring Boot应用程序的jar文件路径。
- ENV:运行环境配置(例如:pre, prod)。
- LOGBACK_PATH:logback配置文件的路径。
- 命令:执行的操作(start, stop, restart, status, starting, help)。
使用方法
./script.sh <jar_path> <env> <logback_path> {start|stop|restart|status|starting|help}
例如:
./script.sh /path/to/your-app.jar prod /path/to/logback.xml start
脚本说明
变量说明
APP_BASE_NAME:Spring Boot应用程序的基础名称。RUN_DIR:PID文件的存储目录。SCRIPT_DIR:脚本所在目录。PID_FILE:存储Spring Boot应用程序进程ID的文件。
功能函数
is_running()
检查Spring Boot应用程序是否正在运行。若运行则返回0,否则返回1。
start()
启动Spring Boot应用程序。如果应用程序已经在运行,提示用户,否则启动应用程序并将其运行在后台。
starting()
以终端打印日志的方式启动Spring Boot应用程序。
stop()
停止Spring Boot应用程序。如果应用程序正在运行,发送终止信号并等待进程退出,然后删除PID文件。
restart()
重启Spring Boot应用程序,先调用stop函数,再调用start函数。
status()
查看Spring Boot应用程序的状态。如果应用程序正在运行,输出进程ID,否则提示应用程序未运行。
help()
显示帮助信息,包括脚本的用法、命令说明和环境变量说明。
主入口
脚本根据传入的参数执行相应的命令。若参数不足或命令无效,将显示帮助信息。
示例
启动应用程序
./script.sh /path/to/your-app.jar prod /path/to/logback.xml start
停止应用程序
./script.sh /path/to/your-app.jar prod /path/to/logback.xml stop
重启应用程序
./script.sh /path/to/your-app.jar prod /path/to/logback.xml restart
查看应用程序状态
./script.sh /path/to/your-app.jar prod /path/to/logback.xml status
以终端打印日志的方式启动应用程序
./script.sh /path/to/your-app.jar prod /path/to/logback.xml starting
显示帮助信息
./script.sh /path/to/your-app.jar prod /path/to/logback.xml help
注意
- 确保脚本具有可执行权限,使用
chmod +x script.sh设置权限。 - 确保运行脚本的用户对PID文件目录有写权限。
- 适当调整
RUN_DIR以符合你的系统环境。