run.sh 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. #!/bin/bash
  2. # JDK
  3. JAVA_HOME="/usr/local/jdk/jdk1.8.0_162/"
  4. #主目录路径
  5. APP_HOME="/srv/server/shebao-server/shebao-admin"
  6. # 需要启动的Java主程序(main方法类)
  7. APP_MAINCLASS="AdminMain"
  8. APP_WORK="$APP_HOME/work"
  9. # 拼凑完整的classpath参数,包括指定lib目录下所有的jar
  10. CLASSPATH="../etc"
  11. for i in $APP_HOME/lib/*.jar; do
  12. CLASSPATH="$CLASSPATH":"$i"
  13. done
  14. # java虚拟机启动参数
  15. # =======================================================================
  16. # -XX:+<option> 开启option参数
  17. # -XX:-<option> 关闭option参数
  18. # -XX:<option>=<value> 将option参数的值设置为value
  19. # =======================================================================
  20. # -Duser.timezone=GMT+08 | 东八区
  21. # -Xms6144m -Xmx6144m | 堆内存设置为6G,并禁止扩展
  22. # -Xmn1536m | 堆内存(6G)中的1.5G分配给新生代,新生代太大会影响gc停顿时间,并且netty tcp长连接保存在老年代里
  23. # -XX:PermSize=288m -XX:MaxPermSize=288m | 永久代固定为288m
  24. # 剩下的就是老年代了 (堆内存size = 新生代size + 老年代size + 永久代size)
  25. # -XX:UseConcMarkSweepGC | 使用ParNew + CMS + Serial Old的收集器组合进行内存回收。如果CMS出现Concurrent Mode Failure,则Serial Old作为后备
  26. # -XX:+CMSClassUnloadingEnabled | 配合UseConcMarkSweepGC选项在jdk1.6中可实现对永久代(PermGen)的GC
  27. # -XX:MaxTenuringThreshold | 晋升到老年代的对象年龄,每个对象在坚持过一次Minor GC后年龄就+1
  28. # -Xloggc:/opt/gc.log
  29. # -XX:+PrintGCDetails | 打印GC详细信息
  30. # -XX:+PrintGCTimeStamps | 打印GC停顿时间
  31. # -XX:+HeapDumpOnOutOfMemoryError | 在发生内存溢出异常时生成堆转储快照
  32. # -XX:HeapDumpPath=/opt/dump/ | 生成堆转储快照的目录
  33. JAVA_OPTS=" -server -Duser.timezone=GMT+08 -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:MaxTenuringThreshold=15 -Xloggc:$APP_WORK/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$APP_WORK/dump/"
  34. # 初始化psid变量(全局)
  35. psid=0
  36. ###################################
  37. # (函数)判断程序是否已启动
  38. #
  39. # 说明:
  40. # 使用JDK自带的JPS命令及grep命令组合,准确查找pid
  41. # jps 加 l 参数,表示显示java的完整包路径
  42. # 使用awk,分割出pid ($1部分),及Java程序名称($2部分)
  43. ###################################
  44. checkpid() {
  45. javaps=`$JAVA_HOME/bin/jps -l | grep "\<${APP_MAINCLASS}\>"`
  46. if [ -n "$javaps" ]; then
  47. psid=`echo $javaps | awk '{print $1}'`
  48. else
  49. psid=0
  50. fi
  51. }
  52. ###################################
  53. # (函数)启动程序
  54. #
  55. # 说明:
  56. # 1.首先调用checkpid函数,刷新$psid全局变量
  57. # 2.如果程序已经启动($psid不等于0),则提示程序已启动
  58. # 3.如果程序没有被启动,则执行启动命令行
  59. # 4.启动命令执行后,再次调用checkpid函数
  60. # 5.如果步骤4的结果能够确认程序的pid,则打印[OK],否则打印[Failed]
  61. # 注意:echo -n 表示打印字符后,不换行
  62. # 注意:"nohup 某命令 >/dev/null 2>&1 &" 的用法
  63. ###################################
  64. start() {
  65. checkpid
  66. if [ $psid -ne 0 ]; then
  67. echo "================================"
  68. echo "warn: $APP_MAINCLASS already started! (pid=$psid)"
  69. echo "================================"
  70. else
  71. echo -n "Starting $APP_MAINCLASS ..."
  72. nohup $JAVA_HOME/bin/java $JAVA_OPTS -classpath $CLASSPATH $APP_MAINCLASS >$APP_WORK/nohup.out 2>&1 &
  73. checkpid
  74. if [ $psid -ne 0 ]; then
  75. echo "(pid=$psid) [OK]"
  76. else
  77. echo "[Failed]"
  78. fi
  79. fi
  80. }
  81. ###################################
  82. #(函数)停止程序
  83. #
  84. #说明:
  85. # 1.首先调用checkpid函数,刷新$psid全局变量
  86. # 2.如果程序已经启动($psid不等于0),则开始执行停止,否则,提示程序未运行
  87. # 3.使用kill -9 pid命令进行强制杀死进程
  88. # 4.执行kill命令行紧接其后,马上查看上一句命令的返回值: $?
  89. # 5.如果步骤4的结果$?等于0,则打印[OK],否则打印[Failed]
  90. # 6.为了防止java程序被启动多次,这里增加反复检查进程,反复杀死的处理(递归调用stop)。
  91. #注意:echo -n 表示打印字符后,不换行
  92. #注意:在shell编程中,"$?" 表示上一句命令或者一个函数的返回值
  93. ###################################
  94. stop() {
  95. checkpid
  96. if [ $psid -ne 0 ]; then
  97. echo -n "Stopping $APP_MAINCLASS ...(pid=$psid) "
  98. kill -9 $psid
  99. if [ $? -eq 0 ]; then
  100. echo "[OK]"
  101. else
  102. echo "[Failed]"
  103. fi
  104. checkpid
  105. if [ $psid -ne 0 ]; then
  106. stop
  107. fi
  108. else
  109. echo "================================"
  110. echo "warn: $APP_MAINCLASS is not running"
  111. echo "================================"
  112. fi
  113. }
  114. ###################################
  115. #(函数)堆转储快照
  116. #
  117. #说明:
  118. # 1.首先调用checkpid函数,刷新$psid全局变量
  119. # 2.如果程序已经启动($psid不等于0),则开始执行jmap,否则,提示程序未运行
  120. #注意:echo -n 表示打印字符后,不换行
  121. #注意:在shell编程中,"$?" 表示上一句命令或者一个函数的返回值
  122. ###################################
  123. dump() {
  124. checkpid
  125. if [ $psid -ne 0 ]; then
  126. echo -n "Dumping $APP_MAINCLASS ...(pid=$psid) "
  127. jmap -dump:live,format=b,file=dump$psid.bin $psid
  128. else
  129. echo "================================"
  130. echo "warn: $APP_MAINCLASS is not running"
  131. echo "================================"
  132. fi
  133. }
  134. ###################################
  135. #读取脚本的第一个参数($1),进行判断
  136. ###################################
  137. case $1 in
  138. start)
  139. echo "start project......"
  140. start
  141. ;;
  142. stop)
  143. echo "stop project......"
  144. stop
  145. ;;
  146. restart)
  147. echo "restart project......"
  148. stop
  149. start
  150. ;;
  151. dump)
  152. echo "dump project......"
  153. dump
  154. ;;
  155. *)
  156. esac
  157. exit 0