#!/bin/bash # ------------------------------------------------------------------- # 代码发布 Shell 脚本 # # 可选命令(以下命令都有一个可选参数,就是指定你要启动哪个jar包) # # - start 启动服务 # - restart 重启服务 # - stop 停止服务 # - ps 查看服务进程 # # 选项列表: # # -tail(tail -f) 使用 tail -f 在程序启动时顺便打印日志 # -nv(-not-valid) 不会服务启动是否成功进行验证。如果要满足这个条件请查看认证服务(authentication-foxlibc)的main函数 # --active(--spring.profile.active) 指定使用哪个配置文件启动, 示例:pub restart --active=dev # --debug 设置远程debug,参数只有一个,那就是端口。示例:pub restart --debug=8080 # # 注意事项:-tail 和 -nv 只能选择一个, 如果两个都有的话那么 -tail 的优先级会比 -nv 选项要高, 所以只会执行 -nv # # 命令示例: # # start: # 无参数启动 - [ pub start ] 默认启动当前所在目录下的 .jar 文件 # 带参数启动 - [ pub start app.jar ] # # 其他的命令参数都一致, 无须赘述! # # @author lts # Create By 2022/07/05 # CMD= STAT= PID= WAITS=0 # ------------------------------------ # Java服务相关变量 APP_NAME='*.jar' JVM_STAT='vm/stat' JVM_DONE='vm/done' # ------------------------------------ # 脚本选项 OPT_TAIL="N" OPT_VALID="Y" OPT_ACTIVE= OPT_DEBUG= # 获取运行命令 if [ -n "$1" ]; then CMD=$1 else echo '-pub error: 启动命令不能为空,可选命令:start | restart | stop' fi # ------------------------------------ # 获取选项 for i in "$@"; do if [ "$i" = "-tail" ]; then OPT_TAIL="Y" fi if [ "$i" = "-nv" ]; then OPT_VALID="N" fi if [[ $i = --active* ]]; then _TEMP=$i OPT_ACTIVE="--spring.profiles.active=${_TEMP#*=}" fi if [[ $i = --debug* ]]; then _TEMP=$i OPT_DEBUG="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=${_TEMP#*=}" fi done # ------------------------------------ # Java启动命令参数 JAVA_OPTS="nohup java" JAVA_OPTS="$JAVA_OPTS $OPT_DEBUG" JAVA_OPTS="$JAVA_OPTS -jar $APP_NAME" JAVA_OPTS="$JAVA_OPTS $OPT_ACTIVE" JAVA_OPTS="$JAVA_OPTS > log.rt 2>&1 &" # ------------------------------------ # function: # 启动服务 function start() { echo "JAVA_OPTS: $JAVA_OPTS" eval $JAVA_OPTS echo "应用程序($APP_NAME)启动完成。" # 使用 tail -f 查看服务日志 if [ "$OPT_TAIL" = "Y" ]; then tail -f log.rt fi # 检测服务是否启动成功 if [ "$OPT_VALID" = "Y" ]; then while [ ! -f $JVM_DONE ]; do echo "正在检测程序是否启动完成($WAITS)" sleep 1 WAITS=$((WAITS + 1)) done # 获取运行状态 STAT=$(cat $JVM_STAT | tail -n +1 | head -n 1) if [ $STAT -eq 1 ]; then echo "服务启动成功($STAT)" else MSG=$(cat $JVM_STAT | tail -n +2 | head -n 1) echo "服务启动失败($STAT), 错误信息: $MSG" fi fi } # ------------------------------------ # function: # 停止服务 function stop() { PID=$(ps aux | grep java | grep $APP_NAME | awk '{print $2}') if [ -n "$PID" ]; then kill -9 $PID echo "终止进程($PID)" else echo "未检测出需要终止的进程" fi } # ------------------------------------ # function: # 重启服务 function restart() { stop start } # 运行脚本函数 case "$CMD" in "start") start ;; "stop") stop ;; "restart") restart ;; "ps") ps -ef | grep $APP_NAME ;; *) echo "未知命令($CMD)" ;; esac