#!/bin/sh
# ./xxxx.sh start|stop|restart|status
# 应用名称
AppName=spring-boot-1.0.jar
# 目录设置
APP_HOME=$(pwd)
LOG_DIR=$APP_HOME/logs
LOG_FILE=$LOG_DIR/$AppName.log
# JVM参数
JVM_OPTS="-Dname=$AppName -Duser.timezone=Asia/Shanghai \
-Xms512m -Xmx1024m \
-XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1024m \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=$APP_HOME \
-XX:+PrintGCDateStamps -XX:+PrintGCDetails \
-XX:NewRatio=1 -XX:SurvivorRatio=30 \
-XX:+UseParallelGC -XX:+UseParallelOldGC"
# 确保必要目录存在
if [ ! -d "$LOG_DIR" ]; then
mkdir -p "$LOG_DIR"
fi
# 检查是否有执行权限
if [ ! -x "$AppName" ] && [ ! -f "$AppName" ]; then
echo -e "错误:找不到可执行的 JAR 文件: $AppName"
exit 1
fi
# 获取PID
get_pid() {
PID=$(ps -ef | grep java | grep "$AppName" | grep -v grep | awk '{print $2}')
# 通过jps(Java进程工具)或检查完整的启动命令 注:检查是否执行jps需要在终端输入jps如图有的话会显示相关Java进程
# PID=$(pgrep -f "$AppName")
}
# 检查操作参数
if [ -z "$1" ]; then
echo "请指定操作名: {start|stop|restart|status}"
exit 1
fi
function start()
{
get_pid
if [ -n "$PID" ]; then
echo "$AppName 已经在运行 (PID: $PID)"
else
# 通过环境变量传递端口,更灵活
nohup java $JVM_OPTS -jar $AppName --server.port=5024 > "$LOG_FILE" 2>&1 &
# 添加短暂延迟以确认应用是否成功启动
sleep 3
get_pid
if [ -n "$PID" ]; then
echo "启动 $AppName 成功 (PID: $PID)"
echo "日志文件: $LOG_FILE"
else
echo "启动 $AppName 失败,请检查日志文件: $LOG_FILE"
exit 1
fi
fi
}
function stop()
{
get_pid
if [ -n "$PID" ]; then
echo "正在停止 $AppName (PID: $PID)"
kill -TERM $PID
# 等待最多10秒让进程关闭
TIMEOUT=10
for ((i=1; i<=$TIMEOUT; i++))
do
get_pid
if [ -z "$PID" ]; then
echo "$AppName 停止成功"
break
fi
if [ $i -eq $TIMEOUT ]; then
echo "警告: 达到最大等待时间,强制杀死进程"
kill -9 $PID
echo "$AppName 强制停止"
fi
sleep 1
done
else
echo "$AppName 未运行"
fi
}
function restart()
{
echo "重启 $AppName"
stop
sleep 2
start
}
function status()
{
get_pid
if [ -n "$PID" ]; then
echo "$AppName 正在运行 (PID: $PID)"
else
echo "$AppName 未运行"
fi
}
case $1 in
start)
start;;
stop)
stop;;
restart)
restart;;
status)
status;;
*)
echo "无效的操作: $1"
echo "请使用 {start|stop|restart|status}"
exit 1;;
esac
当前共有 条评论