- A+
所属分类:linux技术
掰碎了讲一个jar包启动文件.
- 当前服务目录如下
# ls /easy/test/info/ -> bin mytest.jar # ls /easy/test/info/bin/ -> spring-boot.sh
spring-boot.sh 文件内容如下
#!/bin/bash # 环境索引: 标识解释器为bash ./当前文件 等同于 sh 当前文件 # 本次解析执行命令= ./easy/test/info/bin/spring-boot.sh start JAVA_OPTIONS_INITIAL=-Xms500M JAVA_OPTIONS_MAX=-Xmx1000M # 定义变量: 注意=左右不要有空格 BINPATH=$(cd `dirname $0`; pwd) # 获取脚本所在的项目名称 # $0 获取当前脚本本身的名字,其他包执行则包含到当前文件的路径 # dirname 命令去除文件名中的非目录部分,仅显示与目录有关的内容 # $()和反引号``的作用结果相同都是用来作命令替换的,通俗来讲就是把命令执行后的结果作为参数返回 # pwd 命令用于显示工作目录的绝对路径名称 # 先执行 dirname $0 获取当前目录名称, # 再执行cd 切换到当前目录, # ; 分号; 用分号隔开两个命令 # 再执行pwd, 用BINPATH 接受pwd返回结果. # $0 ==> ./easy/test/info/bin/spring-boot.sh # `dirname $0` ==> ./easy/test/info/bin/ # BINPATH==> /easy/test/info/bin if [ $(ls ${BINPATH%/bin*}|grep .*.jar|wc -l) -gt 1 ] ;then # 字符串截取: ${parameter%word} # 删除匹配后缀 # ${BINPATH%/bin*} 获取BINPATH 删除/bin 后面部分 # grep 匹配 # wc 计数 # -gt 大于 # if 流程判断 # 获取脚本上级的.jar 结尾文件是否>1个. echo "目录中含有多个jar文件" exit 0 fi _JAR_KEYWORDS=$(ls ${BINPATH%/bin*}|grep .*.jar) # 获取当前jar包名称(mytest.jar) if [ "$_JAR_KEYWORDS" = "" ] ;then echo "${BINPATH%/bin*}下未找到jar包!!" exit 0 fi APP_NAME=${_JAR_KEYWORDS%.jar*} # 字符串截取: ${parameter%word} # 删除匹配后缀 # ${_JAR_KEYWORDS%.jar*} 去掉jar包的.jar后缀, 赋值给appName字段(mytest) if [ $1 == "start" ] ;then echo "当前启动的项目为:$APP_NAME,项目所在目录:${BINPATH%/bin*}" fi # 查询进程,去掉grep查询, 取第二位(pid) PID=$(ps aux | grep ${_JAR_KEYWORDS} | grep -v grep | awk '{print $2}' ) # ps 进程查看 # | grep -v grep 排除grep 进程,即当前的ps查询进程 # awk 行处理器, awk '{print $2}' 输出第2行数据, 即pid行. function check_if_process_is_running { if [ "$PID" = "" ]; then return 1 fi ps -p $PID | grep "java" # ps 进程查看, 根据pid查看进程 return $? # $? 上一指令的返回值,成功是0,不成功是1。 } case "$1" in status) # case 选择命令 # $1 执行该文件的第一个参数. if check_if_process_is_running then echo -e " 33[32m $APP_NAME is running 33[0m" # echo -e 转义输出 # 33[xm 控制字符 33[32m 指定当前文本绿色展示. else echo -e " 33[32m $APP_NAME not running 33[0m" fi ;; stop) if ! check_if_process_is_running then echo -e " 33[32m $APP_NAME already stopped 33[0m" exit 0 fi kill -9 $PID # kill 杀死指定进程 echo -e " 33[32m Waiting for process to stop 33[0m" NOT_KILLED=1 for i in {1..20}; do if check_if_process_is_running then echo -ne " 33[32m . 33[0m" # echo -ne 转义输出, 不进行换行 sleep 1 else NOT_KILLED=0 fi done echo if [ $NOT_KILLED = 1 ] then echo -e " 33[32m Cannot kill process 33[0m" exit 1 fi echo -e " 33[32m $APP_NAME already stopped 33[0m" ;; start) if [ "$PID" != "" ] && check_if_process_is_running then echo -e " 33[32m $APP_NAME already running 33[0m" exit 1 fi cd ${BINPATH%/bin*} JAVA_MEM_SIZE_OPTS="-Xmx256m -Xms128m -Xmn256m -XX:PermSize=200m -XX:MaxPermSize=200M -Xss256k" JAVA_MEM_OPTS=" -server $JAVA_MEM_SIZE_OPTS -XX:SurvivorRatio=2 -XX:+UseParallelGC " nohup java -jar $JAVA_OPTIONS_INITIAL $JAVA_OPTIONS_MAX $_JAR_KEYWORDS --debug> 123.log 2>&1 & #nohup 不挂起执行 echo -ne " 33[32m Starting 33[0m" for i in {1..20}; do # 通配符(globbing) {1..20} 循环20次,分别取1,2,3...19,20 echo -ne " 33[32m. 33[0m" sleep 1 done if check_if_process_is_running then echo -e " 33[32m $APP_NAME fail 33[0m" else echo -e " 33[32m $APP_NAME started 33[0m" fi ;; restart) $0 stop # 重新执行该文件, 传递参数为 stop if [ $? = 1 ] then exit 1 fi $0 start # 重新执行该文件, 传递参数为 start ;; *) # case 未匹配, 走的默认模组 echo "Usage: $0 {start|stop|restart|status}" exit 1 esac exit 0
-
环境索引
开头"#!/bin/bash"作用 这行注释的作用就是声明解析当前文件要使用的解释器
- 不声明解释器的方式
执行: sh xxx
- 声明"#!/bin/bash"
执行: ./xxx(等同于 sh xxx)
- 声明"#!/bin/cat"
执行: ./xxx(等同于 cat xxx)
-
变量定义和使用
- 定义变量
定义变量, 变量名不加美元符号$ your_name="easy.com" 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。
- 使用一个定义过的变量
在变量名前面加美元符号即可: your_name="qinjx" echo $your_name echo ${your_name} 变量名外面的花括号可选,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况 for skill in Ada Coffe Action Java; do echo "I am good at ${skill}Script" # 识别为: skill echo "I am good at $skillScript" # 自动识别为: skillScript done
-
linux中$用法
- $0, $?等表示各种参数
$0:bash文件名。 $?:上一指令的返回值,成功是0,不成功是1。 $1,$2,$3....:表示命令后接的第几个参数
- ${}, 获取变量的值
${var_name} 跟光$var_name差不多 但是用${ }会比较精确的界定变量名称的范围。
- $(),`` 命令替换
在bash中,$( )与` `(反引号)都是用来作命令替换的,执行括号或者反引号中的命令, 然后返回结果。 比如:echo "present dir is $(pwd)" 但是$()和``还是稍有不同的,在多层次的复合替换中,``必须要额外的跳脱处理(反斜线),而$( )则不用,比较直观。 # 将cmd1执行结果作为cmd2参数,再将cmd2结果作为cmd3的参数 cmd1 $(cmd2 $(cmd3)) # 如果是用反引号,直接引用是不行的,还需要作跳脱处理 cmd1 `cmd2 `cmd3``
-
Linux 特殊字符用法(;,|,&,||,&&)
; 分号; 用分号隔开两个命令,每条命令按照从左到右的顺序,顺序执行,彼此之间不关心是否失败,所有命令都会执行。 | 管道符; 上一条命令的输出,作为下一条命令参数 示例: grep "123" 1.txt | wc -l & 放在启动命令参数后面表示设置此进程为后台进程 || 逻辑或 只有在 || 左边的命令返回假,右边的命令才会被执行。 只要有一个命令返回真,后面的命令都不会被执行。一直到返回真的地方停止执行 && 逻辑与 前一条命令执行成功,才会执行下一条命令。
-
linux ${}文本处理
- 获取字符串长度 $
- 字符串切片$
将字符串变量a从第b个位置开始向后截取c个字符,b是指下标,下标从0开始
- 替换字符串$
将变量a中的b全部替换为c,开头一个正斜杠为只匹配第一个字符串,两个正斜杠为匹配所有字符。 b支持正则示例: echo ${a//[^0-9]/c}
- 字符串截取
${parameter#word} # 删除匹配前缀 ${parameter##word} ${parameter%word} # 删除匹配后缀 ${parameter%%word} # 去掉左边,#最短匹配模式,##最长匹配模式。 % 去掉右边,%最短匹配模式,%%最长匹配模式。
- 变量状态赋值
${VAR:-string} 如果 VAR 变量为空则返回 string ${VAR:+string} 如果 VAR 变量不为空则返回 string ${VAR:=string} 如果 VAR 变量为空则重新赋值 VAR 变量值为 string ${VAR:?string} 如果 VAR 变量为空则将 string 输出到 stderr
-
基本运算符
- 算术运算符(+ - * / % = == !=)
- 关系运算符
-eq //equals等于 -ne //no equals不等于 -gt //greater than 大于 -lt //less than小于 -ge //greater equals大于等于 -le //less equals小于等于
- 布尔运算符
! 非运算,表达式为 true 则返回 false,否则返回 true。 -o 或运算,有一个表达式为 true 则返回 true。 -a 与运算,两个表达式都为 true 才返回 true。
- 整数运算命令(())
双小括号 (( )) 是 Bash Shell 中专门用来进行整数运算的命令 注意:(( )) 只能进行整数运算,不能对小数(浮点数)或者字符串进行运算。后续讲到的 bc 命令可以用于小数运算。 在 (( )) 中使用变量无需加上$前缀,(( )) 会自动解析变量名,这使得代码更加简洁,也符合程序员的书写习惯 这种写法可以在计算完成后给变量赋值 示例: ((b=a-15)) 将 a-15 的运算结果赋值给变量 b。 使用变量时不用加$前缀,(( )) 会自动解析变量名. 可以在 (( )) 前面加上$符号获取 (( )) 命令的执行结果,也即获取整个表达式的值 示例: b=$((a-15)) 将 a-15 的运算结果赋值给变量 b。 类似 c=((a+b)) 这样的写法是错误的,不加$就不能取得表达式的结果 (( )) 也可以进行逻辑运算,在 if 语句中常会使用逻辑运算。 示例: ((a>7 && b==c)) 不用写 -gt -eq 等命令, 直接用数学写法即可.
-
流程控制
- if 判断
if xxx ; then xxx ; fi if xxx ; then xxx ; else xxx ; fi if xxx ; then xxx ; elif xxx ; then xxx ; else xxx ; fi
- for 循环
for xxx in xxx; do xxx done;
- while 循环执行
while xxx ; do xxx done; while true;do curl --request POST --url http://127.0.0.1:8111/api/healthy/post; sleep 1; done
- case 选择
case xxx in x)xxx; ;;*)xxx; ;;esac 每个 case 取值后面必须为单词 in, 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束; * 匹配所有
- 无限循环
while:; do xxx ;done while true;do xxx ;done for ((;;));do xxx ;done
- 跳出循环(break,continue)
-
常用命令
- pwd:(print work directory)命令用于显示工作目录的绝对路径名称。
- grep 命令用于查找文件里符合条件的字符串
详见: grep --help 具体见: info grep
- wc命令用于计算字数。
详情见: wc --help 具体见: info wc -c或--bytes或--chars 只显示Bytes数。 -l或--lines 显示行数。 -w或--words 只显示字数。
- awk 行处理器
详情见: awk 具体见: info awk 示例: | awk '{print $1}' 以空格/tab作为分隔符,获取第2个字符
- ps 进程查看器
详情见: for i in s l o t m a ; do ps --help $i ;done 示例: ps -ef |grep xxx ps aux |grep xxx
- echo 字符串输出
详情见: help echo 选项: -n 不要追加换行 -e 启用下列反斜杠转义的解释 -E 显式地抑制对于反斜杠转义的解释 echo "string" # 输出字符串 echo -e "开启转义" echo -e "xxxn" # 添加换行 ehco -e "xxxc" # 强制不换行