翼度科技»论坛 云主机 LINUX 查看内容

linux 环境启动jar服务, 启动脚本详细解释

9

主题

9

帖子

27

积分

新手上路

Rank: 1

积分
27
掰碎了讲一个jar包启动文件.


  • 当前服务目录如下
  1. # ls /easy/test/info/ -> bin  mytest.jar
  2. #  ls /easy/test/info/bin/ -> spring-boot.sh
复制代码
spring-boot.sh 文件内容如下
  1. #!/bin/bash
  2. # 环境索引: 标识解释器为bash ./当前文件 等同于 sh 当前文件
  3. # 本次解析执行命令= ./easy/test/info/bin/spring-boot.sh  start
  4. JAVA_OPTIONS_INITIAL=-Xms500M
  5. JAVA_OPTIONS_MAX=-Xmx1000M
  6. # 定义变量: 注意=左右不要有空格
  7. BINPATH=$(cd `dirname $0`; pwd)
  8. # 获取脚本所在的项目名称
  9. # $0  获取当前脚本本身的名字,其他包执行则包含到当前文件的路径
  10. # dirname 命令去除文件名中的非目录部分,仅显示与目录有关的内容
  11. # $()和反引号``的作用结果相同都是用来作命令替换的,通俗来讲就是把命令执行后的结果作为参数返回
  12. # pwd 命令用于显示工作目录的绝对路径名称
  13. # 先执行 dirname $0 获取当前目录名称,
  14. # 再执行cd 切换到当前目录,
  15. # ; 分号; 用分号隔开两个命令
  16. # 再执行pwd, 用BINPATH 接受pwd返回结果.
  17. # $0 ==>            ./easy/test/info/bin/spring-boot.sh
  18. # `dirname $0` ==>  ./easy/test/info/bin/
  19. # BINPATH==>        /easy/test/info/bin
  20. if [ $(ls ${BINPATH%/bin*}|grep .*.jar|wc -l) -gt 1 ] ;then
  21. # 字符串截取:  ${parameter%word} # 删除匹配后缀
  22. #   ${BINPATH%/bin*} 获取BINPATH 删除/bin 后面部分
  23. # grep 匹配
  24. # wc 计数
  25. # -gt 大于
  26. # if 流程判断
  27. # 获取脚本上级的.jar 结尾文件是否>1个.
  28.         echo "目录中含有多个jar文件"
  29.         exit 0
  30. fi
  31. _JAR_KEYWORDS=$(ls ${BINPATH%/bin*}|grep .*.jar)
  32. # 获取当前jar包名称(mytest.jar)
  33. if [ "$_JAR_KEYWORDS" =  "" ] ;then
  34.         echo "${BINPATH%/bin*}下未找到jar包!!"
  35.         exit 0
  36. fi
  37. APP_NAME=${_JAR_KEYWORDS%.jar*}
  38. # 字符串截取:  ${parameter%word} # 删除匹配后缀
  39. #   ${_JAR_KEYWORDS%.jar*} 去掉jar包的.jar后缀, 赋值给appName字段(mytest)
  40. if [ $1 == "start" ] ;then
  41.         echo "当前启动的项目为:$APP_NAME,项目所在目录:${BINPATH%/bin*}"
  42. fi
  43. # 查询进程,去掉grep查询, 取第二位(pid)
  44. PID=$(ps aux | grep ${_JAR_KEYWORDS} | grep -v grep | awk '{print $2}' )
  45. # ps    进程查看
  46. # | grep -v grep 排除grep 进程,即当前的ps查询进程
  47. # awk 行处理器, awk '{print $2}' 输出第2行数据, 即pid行.
  48. function check_if_process_is_running {
  49.     if [ "$PID" = "" ]; then
  50.         return 1
  51.     fi
  52.     ps -p $PID | grep "java"
  53.     # ps 进程查看, 根据pid查看进程
  54.     return $?
  55.     # $? 上一指令的返回值,成功是0,不成功是1。
  56. }
  57. case "$1" in
  58. status)
  59. # case 选择命令
  60. # $1 执行该文件的第一个参数.
  61. if check_if_process_is_running
  62. then
  63. echo -e "\033[32m $APP_NAME is running \033[0m"
  64. # echo -e 转义输出
  65. # \033[xm 控制字符 \033[32m 指定当前文本绿色展示.
  66. else
  67. echo -e "\033[32m $APP_NAME not running \033[0m"
  68. fi
  69. ;;
  70. stop)
  71. if ! check_if_process_is_running
  72. then
  73. echo -e "\033[32m $APP_NAME already stopped \033[0m"
  74. exit 0
  75. fi
  76. kill -9 $PID
  77. # kill 杀死指定进程
  78. echo -e "\033[32m Waiting for process to stop \033[0m"
  79. NOT_KILLED=1
  80. for i in {1..20}; do
  81. if check_if_process_is_running
  82. then
  83. echo -ne "\033[32m . \033[0m"
  84. # echo -ne  转义输出, 不进行换行
  85. sleep 1
  86. else
  87. NOT_KILLED=0
  88. fi
  89. done
  90. echo
  91. if [ $NOT_KILLED = 1 ]
  92. then
  93. echo -e "\033[32m Cannot kill process \033[0m"
  94. exit 1
  95. fi
  96. echo -e "\033[32m $APP_NAME already stopped \033[0m"
  97. ;;
  98. start)
  99. if [ "$PID" != "" ] && check_if_process_is_running
  100. then
  101. echo -e "\033[32m $APP_NAME already running \033[0m"
  102. exit 1
  103. fi
  104. cd ${BINPATH%/bin*}
  105. JAVA_MEM_SIZE_OPTS="-Xmx256m -Xms128m -Xmn256m -XX:PermSize=200m -XX:MaxPermSize=200M -Xss256k"
  106. JAVA_MEM_OPTS=" -server $JAVA_MEM_SIZE_OPTS -XX:SurvivorRatio=2 -XX:+UseParallelGC "
  107. nohup java -jar $JAVA_OPTIONS_INITIAL $JAVA_OPTIONS_MAX $_JAR_KEYWORDS --debug> 123.log 2>&1 &
  108. #nohup 不挂起执行
  109. echo -ne "\033[32m Starting \033[0m"
  110. for i in {1..20}; do
  111. # 通配符(globbing) {1..20} 循环20次,分别取1,2,3...19,20
  112. echo -ne "\033[32m.\033[0m"
  113. sleep 1
  114. done
  115. if check_if_process_is_running
  116. then
  117. echo -e "\033[32m $APP_NAME fail \033[0m"
  118. else
  119. echo -e "\033[32m $APP_NAME started \033[0m"
  120. fi
  121. ;;
  122. restart)
  123. $0 stop
  124. # 重新执行该文件, 传递参数为 stop
  125. if [ $? = 1 ]
  126. then
  127. exit 1
  128. fi
  129. $0 start
  130. # 重新执行该文件, 传递参数为 start
  131. ;;
  132. *)
  133. # case 未匹配, 走的默认模组
  134. echo "Usage: $0 {start|stop|restart|status}"
  135. exit 1
  136. esac
  137. exit 0
复制代码

  • 环境索引
    1. 开头"#!/bin/bash"作用
    2. 这行注释的作用就是声明解析当前文件要使用的解释器
    复制代码

    • 不声明解释器的方式
    1. 执行: sh xxx
    复制代码

    • 声明"#!/bin/bash"
    1. 执行: ./xxx(等同于 sh xxx)
    复制代码

    • 声明"#!/bin/cat"
    1. 执行: ./xxx(等同于 cat xxx)
    复制代码
  • 变量定义和使用

    • 定义变量
    1. 定义变量, 变量名不加美元符号$
    2.     your_name="easy.com"
    3. 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。
    复制代码

    • 使用一个定义过的变量
    1. 在变量名前面加美元符号即可:
    2.     your_name="qinjx"
    3.     echo $your_name
    4.     echo ${your_name}
    5. 变量名外面的花括号可选,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况
    6.     for skill in Ada Coffe Action Java; do
    7.         echo "I am good at ${skill}Script"      # 识别为: skill
    8.         echo "I am good at $skillScript"        # 自动识别为: skillScript
    9.     done
    复制代码
  • linux中$用法

    • $0, $?等表示各种参数
    1. $0:bash文件名。
    2. $?:上一指令的返回值,成功是0,不成功是1。
    3. $1,$2,$3....:表示命令后接的第几个参数
    复制代码

    • ${}, 获取变量的值
    1. ${var_name} 跟光$var_name差不多
    2. 但是用${ }会比较精确的界定变量名称的范围。
    复制代码

    • $(),`` 命令替换
    1. 在bash中,$( )与` `(反引号)都是用来作命令替换的,执行括号或者反引号中的命令, 然后返回结果。
    2. 比如:echo "present dir is $(pwd)"
    3. 但是$()和``还是稍有不同的,在多层次的复合替换中,``必须要额外的跳脱处理(反斜线),而$( )则不用,比较直观。
    4. # 将cmd1执行结果作为cmd2参数,再将cmd2结果作为cmd3的参数
    5. cmd1 $(cmd2 $(cmd3))
    6. # 如果是用反引号,直接引用是不行的,还需要作跳脱处理
    7. cmd1 `cmd2 \`cmd3\``
    复制代码
  • Linux 特殊字符用法(;,|,&,||,&&)
  1.     ;   分号; 用分号隔开两个命令,每条命令按照从左到右的顺序,顺序执行,彼此之间不关心是否失败,所有命令都会执行。
  2.     |   管道符; 上一条命令的输出,作为下一条命令参数
  3.         示例: grep "123" 1.txt | wc -l
  4.     &   放在启动命令参数后面表示设置此进程为后台进程
  5.     ||  逻辑或
  6.         只有在 || 左边的命令返回假,右边的命令才会被执行。
  7.         只要有一个命令返回真,后面的命令都不会被执行。一直到返回真的地方停止执行
  8.     &&  逻辑与
  9.         前一条命令执行成功,才会执行下一条命令。
复制代码

  • linux ${}文本处理

    • 获取字符串长度 $
    • 字符串切片$
    1. 将字符串变量a从第b个位置开始向后截取c个字符,b是指下标,下标从0开始
    复制代码

    • 替换字符串$
    1. 将变量a中的b全部替换为c,开头一个正斜杠为只匹配第一个字符串,两个正斜杠为匹配所有字符。
    2. b支持正则示例: echo ${a//[^0-9]/c}
    复制代码

    • 字符串截取
    1. ${parameter#word} # 删除匹配前缀
    2. ${parameter##word}
    3. ${parameter%word} # 删除匹配后缀
    4. ${parameter%%word}
    5. # 去掉左边,#最短匹配模式,##最长匹配模式。
    6. % 去掉右边,%最短匹配模式,%%最长匹配模式。
    复制代码

    • 变量状态赋值
    1. ${VAR:-string} 如果 VAR 变量为空则返回 string
    2. ${VAR:+string} 如果 VAR 变量不为空则返回 string
    3. ${VAR:=string} 如果 VAR 变量为空则重新赋值 VAR 变量值为 string
    4. ${VAR:?string} 如果 VAR 变量为空则将 string 输出到 stderr
    复制代码
  • 基本运算符

    • 算术运算符(+ - * / % = == !=)
    • 关系运算符
    1. -eq //equals等于
    2. -ne //no equals不等于
    3. -gt //greater than 大于
    4. -lt //less than小于
    5. -ge //greater equals大于等于
    6. -le //less equals小于等于
    复制代码

    • 布尔运算符
    1. !        非运算,表达式为 true 则返回 false,否则返回 true。
    2. -o        或运算,有一个表达式为 true 则返回 true。
    3. -a        与运算,两个表达式都为 true 才返回 true。
    复制代码

    • 整数运算命令(())
    1. 双小括号 (( )) 是 Bash Shell 中专门用来进行整数运算的命令
    2. 注意:(( )) 只能进行整数运算,不能对小数(浮点数)或者字符串进行运算。后续讲到的 bc 命令可以用于小数运算。
    3. 在 (( )) 中使用变量无需加上$前缀,(( )) 会自动解析变量名,这使得代码更加简洁,也符合程序员的书写习惯
    4. 这种写法可以在计算完成后给变量赋值
    5.     示例: ((b=a-15)) 将 a-15 的运算结果赋值给变量 b。
    6.     使用变量时不用加$前缀,(( )) 会自动解析变量名.
    7. 可以在 (( )) 前面加上$符号获取 (( )) 命令的执行结果,也即获取整个表达式的值
    8.     示例: b=$((a-15)) 将 a-15 的运算结果赋值给变量 b。
    9.     类似 c=((a+b)) 这样的写法是错误的,不加$就不能取得表达式的结果
    10. (( )) 也可以进行逻辑运算,在 if 语句中常会使用逻辑运算。
    11.     示例: ((a>7 && b==c)) 不用写 -gt -eq 等命令, 直接用数学写法即可.
    12.    
    13.    
    复制代码
  • 流程控制

    • if 判断
    1. if xxx ; then xxx ; fi
    2. if xxx ; then xxx ; else xxx ; fi
    3. if xxx ; then xxx ; elif xxx ; then xxx ; else xxx ; fi
    复制代码

    • for 循环
    1. for xxx in xxx; do xxx done;
    复制代码

    • while 循环执行
    1. while xxx ; do xxx done;
    2. while true;do curl --request POST   --url http://127.0.0.1:8111/api/healthy/post;   sleep 1; done
    复制代码

    • case 选择
    1. case xxx in x)xxx; ;;*)xxx; ;;esac
    2. 每个 case 取值后面必须为单词 in, 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束; * 匹配所有
    复制代码

    • 无限循环
    1. while:; do xxx ;done
    2. while true;do xxx ;done
    3. for ((;;));do xxx ;done
    复制代码

    • 跳出循环(break,continue)

  • 常用命令

    • pwd:(print work directory)命令用于显示工作目录的绝对路径名称。
    • grep 命令用于查找文件里符合条件的字符串
    1. 详见: grep --help
    2. 具体见: info grep
    复制代码

    • wc命令用于计算字数。
    1. 详情见: wc --help
    2. 具体见: info wc
    3. -c或--bytes或--chars 只显示Bytes数。
    4. -l或--lines 显示行数。
    5. -w或--words 只显示字数。
    复制代码

    • awk 行处理器
    1. 详情见: awk
    2. 具体见: info awk
    3. 示例: | awk '{print $1}' 以空格/tab作为分隔符,获取第2个字符
    复制代码

    • ps 进程查看器
    1. 详情见: for i in s l o t m a ; do ps --help $i ;done
    2. 示例:
    3. ps -ef |grep xxx
    4. ps aux |grep xxx
    复制代码

    • echo 字符串输出
    1. 详情见: help echo
    2. 选项:
    3.       -n        不要追加换行
    4.       -e        启用下列反斜杠转义的解释
    5.       -E        显式地抑制对于反斜杠转义的解释
    6. echo "string"       # 输出字符串
    7. echo -e "开启转义"
    8. echo -e "xxx\n"     # 添加换行
    9. ehco -e "xxx\c"     # 强制不换行
    复制代码

    • \033[xxxm 控制字符
    1. 多个参数采用;分割.
    2. \033[0m        关闭所有属性
    3. \033[1m        设置高亮度
    4. \033[30~37m        设置前景色
    5. \033[40~47;m        设置背景色
    6. 示例:
    7. echo -e "\033[31;1m 这是一个红色高亮文字 \033[0m"
    8. 颜色编码示例:
    9. 黑=30,40
    10. 红=31,41
    11. 绿=32,42
    12. 黄=33,43
    13. 蓝=34,44
    14. 紫=35,45
    15. 靛蓝=36,46
    16. 白=37,47
    复制代码

    • 通配符(globbing)
    1. 示例:
    2. # for i in {1..20};do echo -n  "$i," ;done
    3. 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,
    4. # ls {ex{1..3},ex4}.sh
    5. ex1.sh  ex2.sh  ex3.sh  ex4.sh  
    6. # ls {ex[1-3],ex4}.sh   
    7. ex1.sh  ex2.sh  ex3.sh  ex4.sh   
    复制代码

    • sleep 睡眠等待
    1. 详见: sleep --help
    2. sleep 1 # 程序睡眠1秒
    复制代码

    • nohup 不挂起(no hang up)
    1. 用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行
    2. 详见: nohup --help
    3. 示例1:
    4. nohup COMMAND > nohup.out 2>&1 &
    5. 2>&1 解释:
    6.     将标准错误 2 重定向到标准输出 &1 ,标准输出 &1 再被重定向输入到 nohup.out 文件中。
    7.     0 – stdin (standard input,标准输入)
    8.     1 – stdout (standard output,标准输出)
    9.     2 – stderr (standard error,标准错误输出)
    10. 示例2:
    11. nohup COMMAND > /dev/null 2>&1 & # /dev/null 文件不存在则不进行控制台信息输出.
    复制代码

    • kill 杀死进程
    1. 详见: kill --help
    2. 信号名称: kill -l
    3.     常见信号:
    4.         1 (HUP):重新加载进程。
    5.         9 (KILL):杀死一个进程。
    6.         15 (TERM):正常停止一个进程。
    7. 强制杀死指定进程
    8. kill -9 $(ps -ef |grep spring-boot)
    复制代码
日常用shell命令集合


  • 测试环境,docker部署, 每次启动生成一个新的日志文件包, 想直接自动选择到最后一个生成的文件包并进入
  1. cd `ls -t`
  2. # 效果: ll -lrt 选择最后一个文件夹, copy文件名称 cd ${fileName} 回车.
复制代码

  • 杀死指定项目启动的进程
  1. kill -9 $(ps -ef |grep xxxxxx)
  2. # 效果: ps -ef |grep xxxxx 选择pid行, 执行 kill -9 ${pid}
复制代码

  • 将指定文件copy到jar包内并重新启动
  1. ll
  2. mkdir BOOT-INF
  3. mkdir BOOT-INF/lib
  4. mkdir  BOOT-INF/classes
  5. yes | mv *SNAPSHOT.jar BOOT-INF/lib
  6. yes | mv *.properties BOOT-INF/classes
  7. yes | mv *.yml BOOT-INF/classes
  8. yes | mv *.xml BOOT-INF/classes
  9. ll
  10. jar uvf0 *.jar BOOT-INF/
  11. rm -rf  BOOT-INF
  12. ll
  13. sh bin/spring-boot.sh restart
  14. date
  15. # 效果:
  16. # 将*SNAPSHOT.jar 的jar包copy到 BOOT-INF/lib目录
  17. # 将 *.properties 的 properties文件copy到BOOT-INF/classes目录
  18. # 将 *.yml 的 yml文件copy到BOOT-INF/classes目录
  19. # 将 *.xml 的 xml文件copy到BOOT-INF/classes目录
  20. # 将 BOOT-INF 压缩到jar包内.
  21. # 删除临时包, 并重启, 打印当前日期
复制代码
来源:https://www.cnblogs.com/yswb/p/17165190.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

上一篇: 04if分支语句

下一篇: sed与awk(一)

举报 回复 使用道具