Java Linux

V1

  1. #!/bin/sh
  2. # 该脚本为Linux下启动java程序的脚本
  3. #
  4. # author: Fcant
  5. # date: 2021/1/17
  6. #
  7. # 特别注意:
  8. # 该脚本使用系统kill命令来强制终止指定的java程序进程。
  9. # 所以在杀死进程前,可能会造成数据丢失或数据不完整。如果必须要考虑到这类情况,则需要改写此脚本,
  10. #
  11. #
  12. # 根据实际情况来修改以下配置信息 ##################################
  13. # JAVA应用程序的名称
  14. APP_NAME=uid-consumer
  15. # JAVA应用程序端口号
  16. SERVER_PORT=9999
  17. # jar包存放路径
  18. JAR_PATH='/app/uid-consumer'
  19. # jar包名称
  20. JAR_NAME=uid-consumer-1.1.0-SNAPSHOT.jar
  21. # PID 代表是PID文件
  22. JAR_PID=$JAR_NAME\.pid
  23. # 日志输出文件
  24. LOG_FILE=logs
  25. # java虚拟机启动参数
  26. JAVA_OPTS="-Xms512m -Xmx512m -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1024m -XX:ParallelGCThreads=4 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=utf-8"
  27. # 根据实际情况来修改以上配置信息 ##################################
  28. # 检查程序是否处于运行状态
  29. is_exist() {
  30. # 查询出应用服务的进程id,grep -v 是反向查询的意思,查找除了grep操作的run.jar的进程之外的所有进程
  31. pid=`ps -ef|grep $JAR_NAME|grep -v grep|awk '{print $2}' `
  32. # [ ]表示条件测试。注意这里的空格很重要。要注意在'['后面和']'前面都必须要有空格
  33. # [ -z STRING ] 如果STRING的长度为零则返回为真,即空是真
  34. # 如果不存在返回0,存在返回1
  35. if [ -z "${pid}" ]; then
  36. return 0
  37. else
  38. return 1
  39. fi
  40. }
  41. # ######### Shell脚本中$0、$?、$!、$$、$*、$#、$@等的说明 #########
  42. # $$ Shell本身的PID(ProcessID,即脚本运行的当前 进程ID号)
  43. # $! Shell最后运行的后台Process的PID(后台运行的最后一个进程的 进程ID号)
  44. # $? 最后运行的命令的结束代码(返回值)即执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
  45. # $- 显示shell使用的当前选项,与set命令功能相同
  46. # $* 所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数,此选项参数可超过9个。
  47. # $@ 所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
  48. # $# 添加到Shell的参数个数
  49. # $0 Shell本身的文件名
  50. # $1~$n 添加到Shell的各参数值。$1是第1参数、$2是第2参数…。
  51. # 服务启动方法
  52. start() {
  53. is_exist
  54. if [ $? -eq "1" ]; then
  55. echo "$APP_NAME is already running pid is ${pid}"
  56. else
  57. # jar服务启动脚本
  58. nohup java $JAVA_OPTS -Xloggc:$LOG_FILE/gc/gclog.log -XX:HeapDumpPath=$LOG_FILE/gc/HeapDump.hprof -jar $JAR_PATH/$JAR_NAME >./$LOG_FILE/run.log 2>&1 &
  59. echo $! > $JAR_PID
  60. echo "start $APP_NAME successed pid is $! "
  61. tail -1000f $LOG_FILE/run.log
  62. fi
  63. }
  64. # 服务停止方法
  65. stop() {
  66. # is_exist
  67. pidf=$(cat $JAR_PID)
  68. # echo "$pidf"
  69. echo "pid = $pidf begin kill $pidf"
  70. kill $pidf
  71. rm -rf $JAR_PID
  72. sleep 2
  73. # 判断服务进程是否存在
  74. is_exist
  75. if [ $? -eq "1" ]; then
  76. echo "pid = $pid begin kill -9 $pid"
  77. kill -9 $pid
  78. sleep 2
  79. echo "$APP_NAME process stopped!"
  80. else
  81. echo "$APP_NAME is not running!"
  82. fi
  83. }
  84. # 服务运行状态查看方法
  85. status() {
  86. is_exist
  87. if [ $? -eq "1" ]; then
  88. echo "$APP_NAME is running,pid is ${pid}"
  89. else
  90. echo "$APP_NAME is not running!"
  91. fi
  92. }
  93. # 重启服务方法
  94. restart() {
  95. # 调用服务停止命令
  96. stop
  97. # 调用服务启动命令
  98. start
  99. }
  100. # 帮助说明,用于提示输入参数信息
  101. usage() {
  102. echo "Usage: sh run-service.sh [ start | stop | restart | status ]"
  103. exit 1
  104. }
  105. ###################################
  106. # 读取脚本的第一个参数($1),进行判断
  107. # 参数取值范围:{ start | stop | restart | status }
  108. # 如参数不在指定范围之内,则打印帮助信息
  109. ###################################
  110. #根据输入参数,选择执行对应方法,不输入则执行使用说明
  111. case "$1" in
  112. 'start')
  113. start
  114. ;;
  115. 'stop')
  116. stop
  117. ;;
  118. 'restart')
  119. restart
  120. ;;
  121. 'status')
  122. status
  123. ;;
  124. *)
  125. usage
  126. ;;
  127. esac
  128. exit 0

V2

  1. #!/bin/bash
  2. #这里可替换为jar包名字
  3. APP_NAME=xxx-1.0.jar
  4. #根据实际情况修改参数
  5. JVM="-server -Xms2g -Xmx2g -Xmn512m -XX:PermSize=128M -XX:MaxNewSize=128m -XX:MaxPermSize=25zh6m -Xss256k -Djava.awt.headless=true -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled -Xloggc:/logs/xxx-server/GC/xxx-gc.log"
  6. #APPFILE_PATH="-Dspring.config.location=/usr/local/config/application.properties"
  7. #使用说明,用来提示输入参数
  8. usage() {
  9. echo "Usage: sh 执行脚本.sh [start|stop|restart|status|log|backup]"
  10. exit 1
  11. }
  12. #检查程序是否在运行
  13. is_exist(){
  14. pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}' `
  15. #如果不存在返回1,存在返回0
  16. if [ -z "${pid}" ]; then
  17. return 1
  18. else
  19. return 0
  20. fi
  21. }
  22. #启动方法
  23. start(){
  24. is_exist
  25. if [ $? -eq "0" ]; then
  26. echo "${APP_NAME} is already running. pid=${pid} ."
  27. else
  28. #nohup java $JVM -jar $APPFILE_PATH $APP_NAME > /dev/null 2>&1
  29. #后台启动jar包,且控制环境变量,根据实际情况修改吧。
  30. nohup java $JVM -jar $APP_NAME --spring.profiles.active=prod > /dev/null 2>&1 &
  31. fi
  32. }
  33. #停止方法
  34. stop(){
  35. is_exist
  36. if [ $? -eq "0" ]; then
  37. kill -9 $pid
  38. else
  39. echo "${APP_NAME} is not running"
  40. fi
  41. }
  42. #输出运行状态
  43. status(){
  44. is_exist
  45. if [ $? -eq "0" ]; then
  46. echo "${APP_NAME} is running. Pid is ${pid}"
  47. else
  48. echo "${APP_NAME} is NOT running."
  49. fi
  50. }
  51. #重启
  52. restart(){
  53. stop
  54. start
  55. }
  56. #日志
  57. log(){
  58. # 输出实时日志
  59. tail -n 100 -f /logs/fdc-server/fdc-server.log
  60. }
  61. #备份
  62. backup(){
  63. #根据需求自定义备份文件路径。
  64. BACKUP_PATH=/usr/local/webapps/backup/xxx-server/
  65. #获取当前时间作为备份文件名
  66. BACKUP_DATE=`date +"%Y%m%d(%H:%M:%S)"`
  67. echo 'backup file ->'$BACKUP_PATH$BACKUP_DATE'.jar'
  68. #备份当前jar包
  69. cp -r /usr/local/webapps/$APP_NAME $BACKUP_PATH$BACKUP_DATE'.jar'
  70. }
  71. #根据输入参数,选择执行对应方法,不输入则执行使用说明
  72. case "$1" in
  73. "start")
  74. start
  75. ;;
  76. "stop")
  77. stop
  78. ;;
  79. "status")
  80. status
  81. ;;
  82. "restart")
  83. restart
  84. ;;
  85. "log")
  86. log
  87. ;;
  88. "backup")
  89. backup
  90. ;;
  91. *)
  92. usage
  93. ;;
  94. esac