#!/bin/sh ## java env #export JAVA_HOME=/data/jdk1.8.0_121 #export JRE_HOME=$JAVA_HOME/jre ## service name #当前目录 NOW_PATH=$(cd `dirname $0`; pwd) #jar包路径 JAR_DIR=`ls -ltr $NOW_PATH/*.jar| tail -1` #jar包名字 JAR_NAME=${JAR_DIR##*/} #日志名字 LOG_NAME=${JAR_NAME%%.*} PID=$LOG_NAME\.pid #PS3="Select you will exec Menu:" #select i in start stop restart #do case $1 in start) nohup java -Xms256m -Xmx1024m -jar $JAR_NAME > logs/$LOG_NAME.log 2>&1 & echo $! > $NOW_PATH/$PID echo "=== start $JAR_NAME" tail -1000f logs/$LOG_NAME.log ;; stop) echo "=== stop $JAR_NAME" ps -ef|grep $JAR_NAME |grep -v grep |awk '{print $2}'|xargs kill -9 ;; restart) $0 stop sleep 2 $0 start echo "=== restart $LOG_NAME" ;; *) echo "Usage:$0 {start|stop|restart|help}" ;; esac exit 0 #done
时间: 2025-03-10 19:05:07 浏览: 90
<think>嗯,用户想了解如何通过shell脚本管理Java应用程序的启动、停止和重启。我需要结合提供的引用内容,整理出一个清晰的步骤说明。
首先,启动部分。根据引用[3],使用nohup命令在后台运行Java程序,指定JVM参数和配置文件,输出重定向到日志文件。需要确定jar包的位置和名称,可能还需要处理找到最新jar的问题,如引用[1]提到的自动查找最新jar。这部分可能需要用到ls命令按时间排序,取第一个结果。
然后是停止功能。需要先获取应用的进程ID,可以用ps和grep组合命令找到对应的Java进程,再用kill命令终止。要注意避免误杀其他进程,可能需要更精确的匹配,比如jar包名称。
重启的话,其实就是先执行停止,再启动。但要确保停止完成后再启动,可能需要添加等待时间,或者检查进程是否真的终止。
另外,脚本需要接受参数,比如start、stop、restart,可以用case语句处理不同的命令。引用[2]的示例中使用了这种方法,应该参考这个结构。
还要考虑日志文件的处理,比如输出到指定位置,或者使用nohup防止终端关闭后进程终止。引用[3]中的nohup用法是正确的,需要包含进去。
可能还需要设置JVM内存参数,如-Xms和-Xmx,用户的应用可能有不同的需求,所以脚本中应该留出变量位置,方便修改。
安全问题也要注意,比如确保脚本有执行权限,使用绝对路径避免依赖当前目录。引用[1]提到自动查找当前目录的最新jar,但用户可能需要指定固定路径,或者根据实际情况调整。
最后,测试脚本的各种情况,比如重复启动是否处理正确,停止时没有进程是否存在错误,重启是否平滑等。可能需要添加错误处理,比如进程不存在时给出提示。
总结下来,脚本的大致结构是:定义变量(如JAVA_HOME, JAR_NAME, JVM_OPTS),根据参数执行不同操作,启动时找jar包并后台运行,停止时杀进程,重启组合两者。同时给出使用示例和注意事项,如权限、日志管理等。</think>### 如何通过Shell脚本管理Java应用程序
#### 一、脚本核心功能设计
1. **启动应用**
- 使用`nohup`命令在后台运行Java进程,避免终端关闭导致服务中断
- 自动定位JAR文件(支持指定固定路径或动态获取最新文件)
- 设置JVM参数(如内存分配:`-Xms256m -Xmx3024m`)
- 指定Spring配置文件(如`--spring.profiles.active=prod`)
- 日志重定向到文件(如`> app.log 2>&1`)[^3]
2. **停止应用**
- 通过`ps -ef | grep java`查找进程ID(PID)
- 使用`kill -9`强制终止进程(需精确匹配JAR名称避免误杀)[^2]
3. **重启应用**
- 先执行停止逻辑,等待1秒后启动新进程
- 添加进程状态检查确保操作完整性
#### 二、完整脚本示例
```bash
#!/bin/bash
APP_NAME="projectname.jar" # 指定JAR包名称
JAVA_HOME="/app/jdk1.8.0_92/bin/java" # JDK路径
JVM_OPTS="-Xms256m -Xmx3024m" # JVM参数
SPRING_PROFILE="--spring.profiles.active=prod" # 环境配置
case $1 in
start)
nohup $JAVA_HOME -jar $JVM_OPTS $APP_NAME $SPRING_PROFILE > app.log 2>&1 &
echo "Application started"
;;
stop)
PID=$(ps -ef | grep $APP_NAME | grep -v grep | awk '{print $2}')
if [ -n "$PID" ]; then
kill -9 $PID
echo "Application stopped"
else
echo "Application not running"
fi
;;
restart)
$0 stop
sleep 1
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
```
#### 三、关键操作说明
1. **自动查找最新JAR(扩展功能)**
在引用[1]的基础上添加动态查找逻辑:
```bash
# 获取当前目录最新JAR文件
LATEST_JAR=$(ls -t *.jar | head -1)
nohup java -jar $LATEST_JAR > output.log &
```
2. **进程管理强化**
- 精确过滤进程:`grep '[p]attern'`避免误匹配
- 添加状态检查命令:
```bash
status)
PID=$(pgrep -f $APP_NAME)
[ -n "$PID" ] && echo "Running (PID: $PID)" || echo "Not running"
;;
```
#### 四、使用示例
```bash
# 赋予执行权限
chmod +x app_manager.sh
# 启动应用
./app_manager.sh start
# 停止应用
./app_manager.sh stop
# 重启应用
./app_manager.sh restart
```
#### 五、注意事项
1. 确保脚本与JAR文件路径一致(或配置绝对路径)
2. 生产环境建议添加日志轮转机制(如`logrotate`)
3. 内存参数需根据服务器配置调整,避免OOM错误[^3]
4. 复杂场景可增加启动超时检测和健康检查
阅读全文
相关推荐


















