脚本启动Jar应用

简介: 脚本用于启动、关闭或重启在配置文件中指定的一组应用程序。它会从配置文件中读取应用程序的名称、JAR 文件、端口和参数等信息,然后根据用户输入的命令启动、关闭或重启指定的应用程序。使用这个脚本可以方便地管理多个应用程序的运行状态,提高了运维效率。

创建脚本appctl.sh

#!/bin/bash

# 定义常量
CONFIG_FILE="./apps.conf"
APP_STATUS_RUNNING="已经启动!"
APP_STATUS_NOT_RUNNING="没有启动!"

# 读取配置文件
if [ ! -f "$CONFIG_FILE" ]; then
  echo "配置文件 $CONFIG_FILE 不存在!"
  exit 1
fi

# 解析配置文件
declare -A APP_NAMES APP_JARS APP_PARAMS APP_PORTS
while read -r line || [[ -n "$line" ]]; do
  # 跳过注释和空行
  if [[ $line == \#* ]] || [[ -z $line ]]; then
    continue
  fi

  # 解析配置项
  APP_NAME=$(echo "$line" | awk '{print $1}')
  APP_JAR=$(echo "$line" | awk '{print $2}')
  APP_PARAMS=$(echo "$line" | awk '{$1=$2=$NF=""; print $0}')
  APP_PORT=$(echo "$line" | awk '{print $NF}')

  # 保存到关联数组中
  APP_NAMES["$APP_NAME"]=$APP_NAME
  APP_JARS["$APP_NAME"]=$APP_JAR
  APP_PARAMS["$APP_NAME"]=$APP_PARAMS
  APP_PORTS["$APP_NAME"]=$APP_PORT
done < "$CONFIG_FILE"

# 启动指定应用程序
start() {
  # 循环启动应用程序
  for app_name in "${!APP_NAMES[@]}"; do
    # 检查是否指定了启动该应用程序
    if [ -z "$1" ] || [[ " ${1[@]} " =~ " ${app_name} " ]]; then
      APP_PORT=${APP_PORTS[$app_name]}
      APP_PARAMS=${APP_PARAMS[$app_name]}
      APP_JAR=${APP_JARS[$app_name]}

      # 检查应用程序是否已经启动
      if lsof -Pi :$APP_PORT -sTCP:LISTEN -t >/dev/null ; then
        echo "$app_name (端口 $APP_PORT) $APP_STATUS_RUNNING"
      else
        nohup java -jar "$APP_JAR" "$APP_PARAMS" >/dev/null 2>&1 &
        echo "启动 $app_name (端口 $APP_PORT) ..."
      fi
    fi
  done
}

# 关闭指定应用程序
stop() {
  # 循环关闭应用程序
  for app_name in "${!APP_NAMES[@]}"; do
    # 检查是否指定了关闭该应用程序
    if [ -z "$1" ] || [[ " ${1[@]} " =~ " ${app_name} " ]]; then
      APP_PORT=${APP_PORTS[$app_name]}

      # 检查应用程序是否已经启动
      if lsof -Pi :$APP_PORT -sTCP:LISTEN -t >/dev/null ; then
        # 关闭应用程序
        PID=$(lsof -i :$APP_PORT -t)
        kill -9 $PID
        echo "关闭 $app_name (端口 $APP_PORT) ..."
      else
        echo "$app_name (端口 $APP_PORT) $APP_STATUS_NOT_RUNNING"
      fi
    fi
  done
}

# 重启指定应用程序
restart() {
  stop $1
  start $1
}

# 打印帮助信息
usage() {
  echo "使用方法: $0 {start|stop|restart} [应用程序1 应用程序2 ...]"
  exit 1
}

# 判断命令行参数
case "$1" in
  start)
    start "${@:2}"
    ;;
  stop)
    stop "${@:2}"
    ;;
  restart)
    restart "${@:2}"
    ;;
  *)
    usage
    ;;
esac

使用方法:

./app_control.sh {start|stop|restart} [应用程序1 应用程序2 ...]

参数说明:

  • start:启动指定的应用程序,如果未指定应用程序,则启动全部应用程序。
  • stop:停止指定的应用程序,如果未指定应用程序,则停止全部应用程序。
  • restart:重启指定的应用程序,如果未指定应用程序,则重启全部应用程序。
  • [应用程序1 应用程序2 ...]:可选参数,指定要启动/停止/重启的应用程序,多个应用程序名之间用空格分隔。

配置文件格式:

应用程序的配置信息以行为单位存储在配置文件中,每行包含四个字段,各字段之间用空格分隔:

应用程序名 应用程序JAR包路径 应用程序启动参数 应用程序监听端口
  • 应用程序名:任意字符串,用于标识该应用程序。
  • 应用程序JAR包路径:该应用程序的可执行JAR包的路径。
  • 应用程序启动参数:该应用程序启动时需要的参数,可以为空。
  • 应用程序监听端口:该应用程序监听的端口号。

注意事项:

  • 配置文件必须存在,并且必须以UTF-8编码保存。
  • 配置文件中每行必须符合上述格式,且各字段之间用空格分隔。
  • 如果应用程序JAR包路径中包含空格,必须使用双引号将路径括起来。
  • 如果应用程序启动参数中包含空格,必须使用双引号将参数括起来。
  • 如果应用程序监听端口与其他应用程序监听端口重复,可能会导致启动失败。
  • 如果应用程序启动失败,可以查看应用程序日志文件(通常是当前目录下的nohup.out文件)获取更多信息。

最后,建议在运行脚本前先使用chmod +x app_control.sh命令将脚本文件修改为可执行文件。

apps.conf

# 应用程序名称    应用程序JAR包路径    应用程序参数    端口号
myapp1            /usr/local/myapp1.jar --config=/etc/myapp1.conf  8080
myapp2            /usr/local/myapp2.jar --config=/etc/myapp2.conf  8081
myapp3            /usr/local/myapp3.jar --config=/etc/myapp3.conf  8082

使用例子

# 启动所有应用程序
./appctl.sh start

# 启动 myapp1 和 myapp2 应用程序
./appctl.sh start myapp1 myapp2

# 关闭所有应用程序
./appctl.sh stop

# 关闭 myapp2 应用程序
./appctl.sh stop myapp2

# 重启所有应用程序
./appctl.sh restart

# 重启 myapp1 和 myapp3 应用程序
./appctl.sh restart myapp1 myapp3
目录
相关文章
|
7月前
|
运维 Java Shell
Linux非常详细的shell运维脚本一键启动停止状态SpringBoot打成可运行jar包
Linux非常详细的shell运维脚本一键启动停止状态SpringBoot打成可运行jar包
340 0
|
6月前
|
Java jenkins 持续交付
Java项目jar包启动脚本,适用jenkins或定时任务或手动执行
Java项目jar包启动脚本,适用jenkins或定时任务或手动执行
375 3
|
5月前
|
弹性计算 Java Serverless
Serverless 应用引擎操作报错合集之上传自定义JAR包,启动时报错,是什么导致的
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
5月前
|
关系型数据库 Java 分布式数据库
PolarDB产品使用问题之部署到服务器上的Java应用(以jar包形式运行)无法连接,如何解决
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
4月前
|
Java 测试技术 数据库
容器镜像解析问题之解析 Java 应用依赖时识别 jar 包如何解决
容器镜像解析问题之解析 Java 应用依赖时识别 jar 包如何解决
40 0
|
4月前
|
Java Docker 容器
pandora boot热点应用探索问题之使用目录形态压缩jar包的问题如何解决
pandora boot热点应用探索问题之使用目录形态压缩jar包的问题如何解决
|
4月前
|
Java Shell
Java Sprintboot jar 项目启动、停止脚本
Java Sprintboot jar 项目启动、停止脚本
41 0
|
7月前
|
Java Maven 数据安全/隐私保护
Nexus【应用 01】上传jar包到私有Maven仓库的两种方法:手动 Upload 和 mvn deploy 命令(配置+操作流程)
Nexus【应用 01】上传jar包到私有Maven仓库的两种方法:手动 Upload 和 mvn deploy 命令(配置+操作流程)
2739 0
|
7月前
|
Java 关系型数据库 Docker
docker打包部署spring boot应用(mysql+jar+Nginx)
docker打包部署spring boot应用(mysql+jar+Nginx)
|
7月前
|
运维 Dubbo Java
Serverless 应用引擎产品使用之在 Serverless 应用引擎中,查看镜像文件中的 JAR 文件如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
187 2