在实际生产环境中使用 startup.sh
脚本而不是直接使用 java -jar
命令的原因主要有以下几点:
1. 环境配置和管理
系统环境设置
- 设置
JAVA_HOME
、JRE_HOME
等环境变量 - 配置系统级参数如
ulimit
(文件描述符限制、进程数限制等) - 设置工作目录和日志目录
JVM 参数配置
# 示例:在 startup.sh 中可以预定义 JVM 参数
JAVA_OPTS="-Xms512m -Xmx2g -XX:+UseG1GC"
2. 应用配置管理
外部化配置
- 指定不同环境的配置文件:
# 指定不同环境的配置文件 java -jar app.jar --spring.profiles.active=prod
配置文件路径管理
- 设置配置文件、日志文件的路径
- 管理敏感配置(如数据库密码)通过环境变量传递
3. 进程管理
后台运行
# startup.sh 可以确保应用在后台运行
nohup java -jar app.jar > app.log 2>&1 &
PID 管理
- 记录进程 ID,便于后续的停止和监控操作
- 防止重复启动同一应用
4. 日志管理
日志重定向
# 将标准输出和错误输出重定向到日志文件
nohup java -jar app.jar > /var/log/app/console.log 2>&1 &
日志轮转集成
- 与 logrotate 等日志管理工具集成
5. 启动前检查
依赖服务检查
- 检查数据库、消息队列等依赖服务是否可用
- 网络连通性检查
资源检查
- 检查磁盘空间、内存是否充足
- 检查必需的配置文件是否存在
6. 标准化运维
统一接口
- 提供标准的启动、停止、重启接口
- 便于运维团队管理和自动化部署
集成监控
- 集成健康检查、监控脚本
- 发送启动状态通知
7. 安全考虑
权限控制
- 以特定用户身份运行应用
- 设置文件和目录权限
敏感信息处理
- 通过环境变量而非命令行参数传递敏感信息
- 避免敏感信息在进程列表中暴露
典型的 startup.sh 示例
#!/bin/bash# 设置环境变量
export JAVA_HOME=/usr/java/jdk
export APP_HOME=/opt/myapp
export LOG_PATH=/var/log/myapp# JVM 参数
JAVA_OPTS="-Xms1g -Xmx2g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError"
JAVA_OPTS="$JAVA_OPTS -Dspring.profiles.active=prod"
JAVA_OPTS="$JAVA_OPTS -Dlogging.config=$APP_HOME/config/logback-spring.xml"# 应用参数
APP_JAR="$APP_HOME/myapp.jar"
APP_NAME="myapp"# 检查应用是否已经在运行
if [ -f "$APP_HOME/$APP_NAME.pid" ]; thenPID=$(cat $APP_HOME/$APP_NAME.pid)if ps -p $PID > /dev/null; thenecho "$APP_NAME is already running (PID: $PID)"exit 1fi
fi# 启动应用
nohup $JAVA_HOME/bin/java $JAVA_OPTS -jar $APP_JAR > $LOG_PATH/console.log 2>&1 &# 保存 PID
echo $! > $APP_HOME/$APP_NAME.pidecho "$APP_NAME started with PID $!"
这种方式提供了更好的可控性、可维护性和安全性,是企业级应用部署的标准实践。