pub 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. #!/bin/bash
  2. # -------------------------------------------------------------------
  3. # 代码发布 Shell 脚本
  4. #
  5. # 可选命令(以下命令都有一个可选参数,就是指定你要启动哪个jar包)
  6. #
  7. # - start 启动服务
  8. # - restart 重启服务
  9. # - stop 停止服务
  10. # - ps 查看服务进程
  11. #
  12. # 选项列表:
  13. #
  14. # -tail(tail -f) 使用 tail -f 在程序启动时顺便打印日志
  15. # -nv(-not-valid) 不会服务启动是否成功进行验证。如果要满足这个条件请查看认证服务(authentication-foxlibc)的main函数
  16. # --active(--spring.profile.active) 指定使用哪个配置文件启动, 示例:pub restart --active=dev
  17. # --debug 设置远程debug,参数只有一个,那就是端口。示例:pub restart --debug=8080
  18. #
  19. # 注意事项:-tail 和 -nv 只能选择一个, 如果两个都有的话那么 -tail 的优先级会比 -nv 选项要高, 所以只会执行 -nv
  20. #
  21. # 命令示例:
  22. #
  23. # start:
  24. # 无参数启动 - [ pub start ] 默认启动当前所在目录下的 .jar 文件
  25. # 带参数启动 - [ pub start app.jar ]
  26. #
  27. # 其他的命令参数都一致, 无须赘述!
  28. #
  29. # @author lts
  30. # Create By 2022/07/05
  31. #
  32. CMD=
  33. STAT=
  34. PID=
  35. WAITS=0
  36. # ------------------------------------
  37. # Java服务相关变量
  38. APP_NAME='*.jar'
  39. JVM_STAT='vm/stat'
  40. JVM_DONE='vm/done'
  41. # ------------------------------------
  42. # 脚本选项
  43. OPT_TAIL="N"
  44. OPT_VALID="Y"
  45. OPT_ACTIVE=
  46. OPT_DEBUG=
  47. # 获取运行命令
  48. if [ -n "$1" ]; then
  49. CMD=$1
  50. else
  51. echo '-pub error: 启动命令不能为空,可选命令:start | restart | stop'
  52. fi
  53. # ------------------------------------
  54. # 获取选项
  55. for i in "$@"; do
  56. if [ "$i" = "-tail" ]; then
  57. OPT_TAIL="Y"
  58. fi
  59. if [ "$i" = "-nv" ]; then
  60. OPT_VALID="N"
  61. fi
  62. if [[ $i = --active* ]]; then
  63. _TEMP=$i
  64. OPT_ACTIVE="--spring.profiles.active=${_TEMP#*=}"
  65. fi
  66. if [[ $i = --debug* ]]; then
  67. _TEMP=$i
  68. OPT_DEBUG="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=${_TEMP#*=}"
  69. fi
  70. done
  71. # ------------------------------------
  72. # Java启动命令参数
  73. JAVA_OPTS="nohup java"
  74. JAVA_OPTS="$JAVA_OPTS $OPT_DEBUG"
  75. JAVA_OPTS="$JAVA_OPTS -jar $APP_NAME"
  76. JAVA_OPTS="$JAVA_OPTS $OPT_ACTIVE"
  77. JAVA_OPTS="$JAVA_OPTS > log.rt 2>&1 &"
  78. # ------------------------------------
  79. # function:
  80. # 启动服务
  81. function start()
  82. {
  83. echo "JAVA_OPTS: $JAVA_OPTS"
  84. eval $JAVA_OPTS
  85. echo "应用程序($APP_NAME)启动完成。"
  86. # 使用 tail -f 查看服务日志
  87. if [ "$OPT_TAIL" = "Y" ]; then
  88. tail -f log.rt
  89. fi
  90. # 检测服务是否启动成功
  91. if [ "$OPT_VALID" = "Y" ]; then
  92. while [ ! -f $JVM_DONE ]; do
  93. echo "正在检测程序是否启动完成($WAITS)"
  94. sleep 1
  95. WAITS=$((WAITS + 1))
  96. done
  97. # 获取运行状态
  98. STAT=$(cat $JVM_STAT | tail -n +1 | head -n 1)
  99. if [ $STAT -eq 1 ]; then
  100. echo "服务启动成功($STAT)"
  101. else
  102. MSG=$(cat $JVM_STAT | tail -n +2 | head -n 1)
  103. echo "服务启动失败($STAT), 错误信息: $MSG"
  104. fi
  105. fi
  106. }
  107. # ------------------------------------
  108. # function:
  109. # 停止服务
  110. function stop()
  111. {
  112. PID=$(ps aux | grep java | grep $APP_NAME | awk '{print $2}')
  113. if [ -n "$PID" ]; then
  114. kill -9 $PID
  115. echo "终止进程($PID)"
  116. else
  117. echo "未检测出需要终止的进程"
  118. fi
  119. }
  120. # ------------------------------------
  121. # function:
  122. # 重启服务
  123. function restart()
  124. {
  125. stop
  126. start
  127. }
  128. # 运行脚本函数
  129. case "$CMD" in
  130. "start") start
  131. ;;
  132. "stop") stop
  133. ;;
  134. "restart") restart
  135. ;;
  136. "ps") ps -ef | grep $APP_NAME
  137. ;;
  138. *) echo "未知命令($CMD)"
  139. ;;
  140. esac