Linux四:自动化脚本

1 shell 脚本

1.1 概述

shell 解析器

[root@CentOS8 ~]# cat /etc/shells 
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash

# 注:脚本以"#!/bin/bash"开头,用于指定解析器为 "/bin/bash";因为有的系统默认解析器不是这个
# 入门脚本样例,内容为缩进部分
[root@CentOS8 tmp]# vi hello.sh
    #!/bin/bash
    echo "hello"
[root@CentOS8 tmp]# sh hello.sh 
hello

shell 中的变量

  1. 常用的系统变量 $HOME$PWD$SHELL$USER

    # 样例
    echo $HOME
    echo $PWD
    echo $SHELL
    echo $USER
    
  2. 自定义变量

    1. 变量定义规则
      1. 变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写
      2. 等号两侧不能有空格
      3. 在 bash 中,变量默认类型都是字符串类型,无法直接进行数值运算
      4. 变量的值如果有空格,需要使用双引号或单引号括起来
    2. 基于语法
      1. 定义变量:变量=值
      2. 撤销变量:unset 变量
      3. 声明静态变量:readonly 变量 (注意:不能 unset)
  3. 特殊变量

    1. $n :n 为数字,$0 代表该脚本名称,$1-$9 代表第一到第九个参数;十以上的参数需要用大括号包含,如${10}
    2. $# :获取所有输入参数个数,常用于循环
    3. $* :代表命令行中所有的参数,$*把所有的参数看成一个整体
    4. $@ :也代表命令行中所有的参数,不过$@把每个参数区分对待
    5. $? :最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一 个命令正确执行;如果这个变量的值为非0(具体是哪个数由命令自己来决定),则证明 上一个命令执行不正确了
    # $* 与 $@ 区别
    # (1) $* 与 $@ 都表示传递给函数或脚本的所有参数,不被双引号""包含时,都以$1 $2 …$n的形式输出所有参数
    # (2) 当它们被双引号""包含时,"$*"会将所有的参数作为一个整体,以“$1 $2 …$n” 的形式输出所有参数;"$@"会将各个参数分开,以“$1” “$2”…”$n”的形式输出所有参数
    
    # 编写脚本(内容为缩进部分)
    [root@CentOS8 tmp]# vi mytest.sh
        echo "----------无双引号遍历结果----------"
        for i in $*
        do
            echo "I love $i"
        done
        for j in $@
        do
            echo "I love $j"
        done
        echo "----------有双引号遍历结果----------"
        for i in "$*"
        do
            echo "I love $i"
        done
        for j in "$@"
        do
            echo "I love $j"
        done
    
    # 测试结果
    [root@CentOS8 tmp]# sh mytest.sh java c shell
    ----------无双引号遍历结果----------
    I love java
    I love c
    I love shell
    I love java
    I love c
    I love shell
    ----------有双引号遍历结果----------
    I love java c shell
    I love java
    I love c
    I love shell
    

运算符

  1. 基本语法

    1. $((运算式))$[运算式]
    2. expr +,-,\*,/,% ,加、减、乘、除、取模运算。注:expr 运算符间要有空格
  2. 样例

    [root@CentOS8 ~]# expr 2+3					# 由结果可知,2+3中间要有空格,否则原样输出
    2+3
    [root@CentOS8 ~]# expr 2 + 3				# 加
    5
    [root@CentOS8 ~]# sum=$((2+3))				# $((运算式)) 方法
    [root@CentOS8 ~]# echo $sum
    5
    [root@CentOS8 ~]# expr 2 - 3				# 减
    -1
    
    # 计算 (2+3)*4
    [root@CentOS8 ~]# expr `expr 2 + 3` \* 4	# expr 表达式方式
    20
    [root@CentOS8 ~]# result=$[(2+3)*4]			# $[运算式] 方法
    [root@CentOS8 ~]# echo $result
    20
    

条件判断

  1. 基本语法:[ condition ] 。注意事项如下

    1. condition 前后要有空格
    2. 条件非空即为 ture。如 [ aaa ] 返回true,[] 返回 false
  2. 常用判断条件

    1. 两个整数之间比较

      命令 说明
      = 字符串比较
      -lt (less than) 小于
      -le (less equal) 小于等于
      -eq (equal) 等于
      -gt (greater than) 大于
      -ge (greater equal) 大于等于
      -ne (not equal) 不等于
    2. 按照文件权限进行判断

      命令 说明
      -r (read) 有读的权限
      -w (write) 有写的权限
      -x (execute) 有执行的权限
    3. 按照文件类型进行判断

      命令 说明
      -e (existence) 文件存在
      -f (file) 文件存在并且是一个常规的文件
      -d (directory) 文件存在并且是一个目录
    4. 多条件判断

      1. && 表示前一条命令执行成功时,才执行后一条命令
      2. || 表示上一条命令执行 失败后,才执行下一条命令
  3. 样例

    # 23是否大于等于22
    [root@CentOS8 tmp]# [ 23 -ge 22 ]
    [root@CentOS8 tmp]# echo $?				# 由上文可知,$?=0表示正常,非0不正常
    0
    # hello.sh 是否具有写权限
    [root@CentOS8 tmp]# [ -w hello.sh ]
    [root@CentOS8 tmp]# echo $?
    0
    # aaa.txt 和 bbb.txt 是否存在(由下面结果可知前者存在后者不存在)
    [root@CentOS8 tmp]# [ -e /tmp/aaa.txt ]
    [root@CentOS8 tmp]# echo $?
    0		
    [root@CentOS8 tmp]# [ -e /tmp/bbb.txt ]
    [root@CentOS8 tmp]# echo $?
    1
    # 多条件判断样例
    [root@CentOS8 tmp]# [ condition ] && echo ok || echo notOk
    ok
    [root@CentOS8 tmp]# [ condition ] && [ ] || echo notOk
    notOk
    

read 读取控制台输入

  1. 语法:read [选项] [参数]

    1. 选项:-p 指定读取值时的提示符;-t 指定读取值时等待的时间(秒);-n 指定读入有效字符的数个
    2. 参数:变量 指定读取值的变量名
  2. 样例

    [root@CentOS8 tmp]# vi read.sh 
        #!/bin/bash
        read -t 5 -p "enter your name in 5s " NAME
        echo $NAME
    [root@CentOS8 tmp]# sh read.sh 
    enter your name in 5s zhangsan
    zhangsan
    

函数用法

  1. 系统函数

    1. basename [string/pathname] [suffix] ,basename 命令会删掉所有的前缀包括最后一个("/")字符,然后将字符串显示出来。选项 suffix 为后缀,如果 suffix 被指定了,basename 会将 pathname 或 string 中的 suffix 去掉。

    2. dirname 文件绝对路径 ,从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)

    3. 样例

      [root@CentOS8 tmp]# touch /usr/local/a.txt
      [root@CentOS8 tmp]# basename /usr/local/a.txt 
      a.txt
      [root@CentOS8 tmp]# basename /usr/local/a.txt .txt
      a
      [root@CentOS8 tmp]# dirname /usr/local/a.txt 
      /usr/local
      
  2. 自定义函数

    1. 语法

      [ function ] funname[()]
      {
          Action;
          [return int;]
      }
      funname
      
      # 经验技巧
      # (1) 必须在调用函数地方之前,先声明函数,shell 脚本是逐行运行。不会像其它语言一样先编译
      # (2) 函数返回值,只能通过$?系统变量获得,可以显示加 return 返回,如果不加,将以最后一条命令运行结果,作为返回值。return 后跟数值 n(0-255)
      
    2. 样例

      # 需求1:计算两个输入参数的和
      [root@CentOS8 tmp]# vi sum1.sh
          #!/bin/bash
          function sum()
          {
              sum=0
              sum=$[$1 + $2]
              echo "$sum"
          }
          read -p "please input num1:" n1
          read -p "please input num2:" n2
          sum $n1 $n2
      
      [root@CentOS8 tmp]# sh sum1.sh 
      please input num1:3
      please input num2:6
      9
      
      # 需求2:求输入的任意个参数之和
      [root@CentOS8 tmp]# vi sum2.sh
          #!/bin/bash
          sum=0
          for i in "$@"
          do 
              sum=$[$sum + $i]
          done 
          echo $sum
      [root@CentOS8 tmp]# sh sum2.sh 1 3 5 7 9 
      25
      
      

1.2 流程控制(重要)

if 判断

  1. 语法

    if [ condition ];then
        程序
    fi
    
    # 或者
    
    if [ condition ]
    then
        程序
    fi
    
    # 注意事项
    # (1) [ condition ],中括号和条件判断式之间必需有空格
    # (2) if 后要有空格
    
  2. 样例

    # 需求:输入一个数字,若是1则输出"hello shell",若是2则输出"hi shell",若是其他则什么也不输出
    # 编写脚本,内容为缩进部分
    vi if.sh
        #!/bin/bash
        if [ $1 -eq "1" ]
        then
            echo "hello shell"
        elif [ $1 -eq "2" ]
        then 
            echo "hi shell"
        fi
    	
    # 测试(输入3时,什么也没输出)
    [root@CentOS8 tmp]# sh if.sh 1
    hello shell
    [root@CentOS8 tmp]# sh if.sh 2
    hi shell
    [root@CentOS8 tmp]# sh if.sh 3
    

case 语句

  1. 语法

    case $变量名 in
     "值1")
         如果变量的值等于值 1,则执行程序 1
     ;;
     "值2")
         如果变量的值等于值 2,则执行程序 2
     ;;
     ...省略其他分支...
     *)
         如果变量的值都不是以上的值,则执行此程序
     ;;
    esac
    
    # 注意事项
    # (1) case 行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束
    # (2) 双分号“;;”表示命令序列结束,相当于 java 中的 break
    # (3) 最后的“*)”表示默认模式,相当于 java 中的 default
    
  2. 样例

    # 需求:输入一个数字,若是1则输出"hello shell",若是2则输出"hi shell",若是其他数字输出"input error"
    # 编写脚本,内容为缩进部分
    [root@CentOS8 tmp]# vi case.sh
        #!/bin/bash
        case $1 in 
        "1")
            echo "hello shell"
        ;;
        "2")
            echo "hi shell"
        ;;
        *)
            echo "input error"
        ;;
        esac
        
    # 测试
    [root@CentOS8 tmp]# sh case.sh 1
    hello shell
    [root@CentOS8 tmp]# sh case.sh 2
    hi shell
    [root@CentOS8 tmp]# sh case.sh 3
    input error
    

for 循环

  1. 语法

    for (( 初始值;循环控制条件;变量变化 ))
    do
       程序
    done
    
    # 或者
    
    for 变量 in 值1 值2 值3...
    do
        程序
    done
    
  2. 样例

    # 需求1:求1-100之和
    [root@CentOS8 tmp]# vi for1.sh
        #!/bin/bash
        sum=0
        for(( i=0; i<=100; i++ ))
        do 
            sum=$[$sum+$i]
        done 
        echo $sum
    [root@CentOS8 tmp]# sh for1.sh 
    5050
    
    # 需求2:打印所有输入参数
    [root@CentOS8 tmp]# vi for2.sh
    [root@CentOS8 tmp]# cat for2.sh java php c# shell go
        #!/bin/bash
        for i in $*
        do
            echo "I love $i"
        done
    [root@CentOS8 tmp]# sh for2.sh java php c# shell go
    I love java
    I love php
    I love c#
    I love shell
    I love go
    

while 循环

  1. 语法

    while [ condition ]
    do
        程序
    done
    
  2. 样例

    # 需求:求1-100之和
    [root@CentOS8 tmp]# vi while.sh 
        #!/bin/bash
        sum=0
        i=1
        while [ $i -le 100 ]
        do 
            sum=$[$sum+$i]		# 等号两侧不要有空格,否则报错!!!
            i=$[$i+1]
        done
        echo $sum
        
    [root@CentOS8 tmp]# sh while.sh 
    5050
    

1.3 使用样例

样例一:微服务打包发布

  1. 打包 package.bat

    # 在win环境开发,因此打包脚本为 bat 脚本
    @echo on
    :: 1. 设置控制台标题
    title PACKAGE-TIME-%date%-%time%
    
    :: 2. 进入父pom文件进行打包
    cd food-social-contact-parent
    mvn clean package -Dmaven.test.skip=true
    
  2. 整理 copy.bat

    # 将编译生成的jar包和该微服务对应的配置文件收集到指定目录【以当前时间为文件夹名】
    @echo on
    :: 1. 设置控制台标题,标题为"当前运行时间"
    title XCOPY-TIME-%date%-%time%
    
    :: 2. 创建本次运行生成的目录,jar 包全放在该目录下
    :: 小时单独处理,因为 10 点之前截取的是 " 9" 而不是 "09",中间出现空格导致脚本运行报错
    set hour=%time:~0,2%
    set hour=%hour: =0%
    set nowTime=%date:~0,4%-%date:~5,2%-%date:~8,2%-%hour%-%time:~3,2%-%time:~6,2%
    echo %nowTime%
    mkdir %nowTime%	
    
    :: 3. 将"1_package.bat"生成的jar包移动到创建的目录下,接着将配置文件也移动到该目录下
    :: 注:注意路径是 "\",而不是"/",这个路径问题捣鼓了好久!!!
    :: 注:注意 xcopy 与 copy 命令的差别!!!收集 jar 包的命令也可由 move 代替~~
    :: move "food-social-contact-parent\ms-eureka\target\ms-eureka-1.0-SNAPSHOT.jar" "%nowTime%" 
    
    xcopy "food-social-contact-parent\ms-eureka\target\ms-eureka-1.0-SNAPSHOT.jar" "%nowTime%" 
    xcopy "food-social-contact-parent\ms-gateway\target\ms-gateway-1.0-SNAPSHOT.jar" "%nowTime%" 
    xcopy "food-social-contact-parent\ms-diners\target\ms-diners-1.0-SNAPSHOT.jar" "%nowTime%" 
    xcopy "food-social-contact-parent\ms-oauth2-server\target\ms-oauth2-server-1.0-SNAPSHOT.jar" "%nowTime%" 
    xcopy "food-social-contact-parent\ms-points\target\ms-points-1.0-SNAPSHOT.jar" "%nowTime%" 
    xcopy "food-social-contact-parent\ms-restaurants\target\ms-restaurants-1.0-SNAPSHOT.jar" "%nowTime%" 
    xcopy "food-social-contact-parent\ms-seckill\target\ms-seckill-1.0-SNAPSHOT.jar" "%nowTime%" 
    xcopy "food-social-contact-parent\ms-feeds\target\ms-feeds-1.0-SNAPSHOT.jar" "%nowTime%" 
    xcopy "food-social-contact-parent\ms-follow\target\ms-follow-1.0-SNAPSHOT.jar" "%nowTime%" 
    
    copy "food-social-contact-parent\ms-eureka\src\main\resources\application.yml" "%nowTime%\application-eureka.yml"
    copy "food-social-contact-parent\ms-gateway\src\main\resources\application.yml" "%nowTime%\application-gateway.yml" 
    copy "food-social-contact-parent\ms-diners\src\main\resources\application.yml" "%nowTime%\application-diners.yml" 
    copy "food-social-contact-parent\ms-oauth2-server\src\main\resources\application.yml" "%nowTime%\application-oauth2.yml" 
    copy "food-social-contact-parent\ms-points\src\main\resources\application.yml" "%nowTime%\application-point.yml" 
    copy "food-social-contact-parent\ms-restaurants\src\main\resources\application.yml" "%nowTime%\application-restaurants.yml" 
    copy "food-social-contact-parent\ms-seckill\src\main\resources\application.yml" "%nowTime%\application-seckill.yml" 
    copy "food-social-contact-parent\ms-feeds\src\main\resources\application.yml" "%nowTime%\application-feeds.yml" 
    copy "food-social-contact-parent\ms-follow\src\main\resources\application.yml" "%nowTime%\application-follow.yml" 
    copy "4_start.sh" "%nowTime%\start.sh"
    copy "5_stop.sh" "%nowTime%\stop.sh"
    
  3. 上传 scp.bat

    # cmd 下使用 scp 命令即可,例如
    scp 2021-10-15-10-18-07/* root@192.168.241.136:/tmp
    
  4. 启动 start.sh

    # 0表示 stdin,即标准输入;1表示 stdout,即标准输出;2表示 stderr,即标准错误。
    # 因此 2>&1 表示将错误重定向到标准输出上。结尾最后的 & 表示后台运行
    nohup java -jar ms-eureka-1.0-SNAPSHOT.jar --spring.config.additional-location=application-eureka.yml > ./logs/ms-eureka.log 2>&1 &
    nohup java -jar ms-gateway-1.0-SNAPSHOT.jar --spring.config.additional-location=application-gateway.yml > ./logs/ms-gateway.log 2>&1 &
    nohup java -jar ms-diners-1.0-SNAPSHOT.jar --spring.config.additional-location=application-diners.yml > ./logs/ms-diners.log 2>&1 &
    nohup java -jar ms-oauth2-server-1.0-SNAPSHOT.jar --spring.config.additional-location=application-oauth2.yml > ./logs/ms-oauth2.log 2>&1 &
    nohup java -jar ms-points-1.0-SNAPSHOT.jar --spring.config.additional-location=application-points.yml > ./logs/ms-points.log 2>&1 &
    nohup java -jar ms-restaurants-1.0-SNAPSHOT.jar --spring.config.additional-location=application-restaurants.yml > ./logs/ms-restaurants.log 2>&1 &
    nohup java -jar ms-seckill-1.0-SNAPSHOT.jar --spring.config.additional-location=application-seckill.yml > ./logs/ms-seckill.log 2>&1 &
    nohup java -jar ms-feeds-1.0-SNAPSHOT.jar --spring.config.additional-location=application-feeds.yml > ./logs/ms-feeds.log 2>&1 &
    nohup java -jar ms-follow-1.0-SNAPSHOT.jar --spring.config.additional-location=application-follow.yml > ./logs/ms-follow.log 2>&1 &
    
    echo "所有微服务成功启动,按任意键继续..."
    # read -n 1
    # read -n 1 表示等待输入一个字符,达到类似 pause 的目的
    
  5. 终止 stop.sh

    # 根据端口号终止进程,若是将来配置文件中端口号改了,终止脚本 stop.sh 此处也记得修改
    EUREKA_PORT=8080
    GATEWAY_PORT=80
    DINERS_PORT=8081
    OAUTH2_PORT=8082
    SECKILL_PORT=8083
    FOLLOW_PORT=8084
    FEEDS_PORT=8085
    POINTS_PORT=8086
    RESTAURANTS_PORT=8087
    
    # [root@localhost logs]# lsof -i:8080 | grep "LISTEN" 
    # java    4422 root   11u  IPv6  49996      0t0  TCP *:webcache (LISTEN)
    # awk '{print $2}' 就是输出第二个参数,即 4422 (该参数即为 8080 端口对应的进程号)
    # xargs kill -9 即把上一步打印的进程号当参数传过来,然后终止掉
    
    lsof -i:$EUREKA_PORT | grep "LISTEN" | awk '{print $2}' | xargs kill -9
    lsof -i:$GATEWAY_PORT | grep "LISTEN" | awk '{print $2}' | xargs kill -9
    lsof -i:$DINERS_PORT | grep "LISTEN" | awk '{print $2}' | xargs kill -9
    lsof -i:$OAUTH2_PORT | grep "LISTEN" | awk '{print $2}' | xargs kill -9
    lsof -i:$SECKILL_PORT | grep "LISTEN" | awk '{print $2}' | xargs kill -9
    lsof -i:$FOLLOW_PORT | grep "LISTEN" | awk '{print $2}' | xargs kill -9
    lsof -i:$FEEDS_PORT | grep "LISTEN" | awk '{print $2}' | xargs kill -9
    lsof -i:$POINTS_PORT | grep "LISTEN" | awk '{print $2}' | xargs kill -9
    lsof -i:$RESTAURANTS_PORT | grep "LISTEN" | awk '{print $2}' | xargs kill -9
    
    echo "所有微服务成功停止,按任意键继续..."
    # read -n 1
    

2 bat 脚本

2.1 概述

  1. 批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理,通常被认为是一种简化的脚本语言,它应用于 DOS (Disk Operating System,磁盘操作系统)和 Windows 系统中。批处理文件的扩展名为 .bat
  2. bat文件要保存成 ANSI,否则运行时中文乱码;若是 UTF-8等编码方式,可以使用记事本打开,另存为时选择 ANSI 方式

2.2 常用命令

序号 命令 作用
1 rem 和 :: 注释
2 echo 和 @ 作用见下面详解
3 pause 暂停
eg. echo 请按任意键继续 & pause > nul
4 title 设置 cmd 窗口的标题
eg. title 新标题 (此时可以看到标题变了)
5 color 设置默认的控制台前景色和背景色
6 errorlevel 程序返回码
eg. echo %errorlevel%
7 start 调用外部程序的命令
8 call 在批处理执行过程中调用另一个批处理
当另一个批处理执行完后,再继续执行原来的批处理
9 find 在文件中搜索字符串
10 mode 配置系统设备
11 assoc 和 ftype 文件关联
12 pushd 和 popd 切换当前目录 (一般用处不大)
13 shift 更改批处理文件中可替换参数的位置
14 if 条件判断语句
15 goto 和 : 跳转
16 cls 清屏

rem 和 ::

  1. rem 为注释命令,一般用来给程序加上注解,该命令后的内容不被执行,但能回显(@rem 则不回显)。
  2. :: 也可以起到rem 的注释作用, 而且更简洁有效
  • 注意
    1. 任何以冒号( : )开头的字符行, 在批处理中都被视作标号, 而直接忽略其后的所有内容。
      1. 有效标号:冒号后紧跟一个以字母数字开头的字符串,goto语句可以识别。
      2. 无效标号:冒号后紧跟一个非字母数字的一个特殊符号,goto无法识别的标号,可以起到注释作用。所以 :: 常被用作注释符号,其实 :+ 也可起注释作用。
    2. 与 rem 不同的是, :: 后的字符行在执行时不会回显, 无论是否用echo on打开命令行回显状态, 因为命令解释器不认为他是一个有效的命令行, 就此点来看, rem 在某些场合下将比 :: 更为适用; 另外, rem 可以用于 config.sys 文件中。
    3. 行内注释格式:%注释内容% (不常用,慎用)

echo 和 @

  1. @ 字符放在命令前将关闭该命令回显,无论此时 echo 是否为打开状态。 (因此 @rem 不回显)

  2. echo用法

    序号 命令 作用
    1 echo on / off 打开回显或关闭回显功能
    2 echo 查看当前 echo 状态
    3 echo msg 输出提示信息
    4 echo. 空行 / 回车
    5 echo 文件内容 > 文件名 创建文件
    6 echo 文件内容 >> 文件名 追加内容
  3. 样例

    D:\>echo hello,world > hello.txt	# 创建 hello.txt 文件,内容为 hello,world
    D:\>echo hello,bat >> hello.txt		# 在 hello.txt 文件中,追加 hello,bat 内容
    

color

  1. color [attr], attr 用于指定控制台输出的颜色属性

  2. 颜色属性由两个十六进制数字指定,第一个为背景色,第二个则为前景色。每个数字可以为以下任何值之一

    0 = 黑色       8 = 灰色
    1 = 蓝色       9 = 淡蓝色
    2 = 绿色       A = 淡绿色
    3 = 湖蓝色     B = 淡浅绿色
    4 = 红色       C = 淡红色 
    5 = 紫色       D = 淡紫色
    6 = 黄色       E = 淡黄色
    7 = 白色       F = 亮白色
    
    # 样例
    color 10 	# 背景色改成蓝色,字体(即前景色)改成黑色
    color 07 	# 背景色改成黑色,字体改成白色(即默认)
    

pause 与 pause > nul

  • 两者都是暂停然后按任意键继续。pause 会有 "请按任意键继续. . ." 的提示语;而 pause>nul 没有提示语、在脚本用可以和echo连用完成自定义提示信息。
# 样例

# a.bat 内容如下
@echo off
echo "hello,world"
pause
echo "hello,bat"

# b.bat 内容如下
@echo off
echo "hello,world" 
echo "勤能补拙,按任意键继续..." 
pause>nul
echo "hello,bat"

# 运行
D:\>a.bat
"hello,world"
请按任意键继续. . .
"hello,bat"

D:\>b.bat
"hello,world"
"勤能补拙,按任意键继续..."	# 实现自定义提示信息
"hello,bat"

2.3 使用样例

样例一:微服务打包&运行

  • 该微服务项目没有父pom,若是有父pom的话,直接在父pom打包,就会把所有子模块一起打包(见上文 linux 脚本样例)
@echo on

:: 本次运行时间
title RUN-TIME-%date%-%time%

:: 步骤一:将 workspace 下面的各个项目进行打包
cd D:\idea-2018\code\workspace\gmall-eureka
call mvn clean package
cd D:\idea-2018\code\workspace\gmall-gateway
call mvn clean package
cd D:\idea-2018\code\workspace\gum-service
call mvn clean package
cd D:\idea-2018\code\workspace\ggm-service
call mvn clean package
cd D:\idea-2018\code\workspace\gcm-service
call mvn clean package
cd D:\idea-2018\code\workspace\gsm-service
call mvn clean package
:: 控制台输出"package end"提示所有打包均已完成,然后程序暂停
echo ********************* package end ************************
pause

:: 步骤二:将打包生成的 jar 文件统一 复制/移动到某文件夹(若有重名文件会覆盖)
@rem xcopy D:\idea-2018\code\workspace\gmall-eureka\target\gmall-eureka-0.0.1-SNAPSHOT.jar D:\idea-2018\code\workspace_jar\
move D:\idea-2018\code\workspace\gmall-eureka\target\gmall-eureka-0.0.1-SNAPSHOT.jar D:\idea-2018\code\workspace_jar\
move D:\idea-2018\code\workspace\gmall-gateway\target\gmall-gateway-0.0.1-SNAPSHOT.jar D:\idea-2018\code\workspace_jar\
move D:\idea-2018\code\workspace\gum-service\target\gum-service-0.0.1-SNAPSHOT.jar D:\idea-2018\code\workspace_jar\
move D:\idea-2018\code\workspace\ggm-service\target\ggm-service-0.0.1-SNAPSHOT.jar D:\idea-2018\code\workspace_jar\
move D:\idea-2018\code\workspace\gcm-service\target\gcm-service-0.0.1-SNAPSHOT.jar D:\idea-2018\code\workspace_jar\
move D:\idea-2018\code\workspace\gsm-service\target\gsm-service-0.0.1-SNAPSHOT.jar D:\idea-2018\code\workspace_jar\
echo ********************* copy / move end ************************
pause

:: 步骤三:运行各个 jar 包
:: start 后边第一个是给启动后的cmd窗口命名(即 title 属性)。/D 后面的是jar包所在路径,然后就是jar包运行命令了
start "eureka" /D "D:\idea-2018\code\workspace_jar" java -jar gmall-eureka-0.0.1-SNAPSHOT.jar &
start "gateway" /D "D:\idea-2018\code\workspace_jar" java -jar gmall-gateway-0.0.1-SNAPSHOT.jar &
start "gum" /D "D:\idea-2018\code\workspace_jar" java -jar gum-service-0.0.1-SNAPSHOT.jar &
start "ggm" /D "D:\idea-2018\code\workspace_jar" java -jar ggm-service-0.0.1-SNAPSHOT.jar &
start "gcm" /D "D:\idea-2018\code\workspace_jar" java -jar gcm-service-0.0.1-SNAPSHOT.jar &
start "gsm" /D "D:\idea-2018\code\workspace_jar" java -jar gsm-service-0.0.1-SNAPSHOT.jar &
echo ********************* start end ************************
pause

样例二:重启集群

@echo off
set file_path="E:\dist"
:: (1)终止以前正在运行的程序。集群环境是store.exe为数据节点(dnode)有6个;cm.exe为管理节点(mnode)有一个
taskkill /F /IM store.exe
taskkill /F /IM cm.exe
:: 下面代码"-n 3"等价于停3秒
ping -n 3 127.1>nul
if (%file_path%)==("") (
	echo Error:file path is empty
	ping -n 10 127.1>nul
	exit -1
)

:: (2)删除上次运行时生成的数据文件
:: rd 是 remove directory 简写;"/s" 用于删除目录树; "/q" 安静模式,删除时无需确认
echo delete cm data
rd /s /q %file_path%\cm\data
ping -n 1 127.1>nul

echo delete node0
rd /s /q %file_path%\distNode0_0\data %file_path%\distNode0_0\wal %file_path%\distNode0_0\log 
rd /s /q %file_path%\distNode0_1\data %file_path%\distNode0_1\wal %file_path%\distNode0_1\log 
rd /s /q %file_path%\distNode0_2\data %file_path%\distNode0_2\wal %file_path%\distNode0_2\log 
ping -n 1 127.1>nul

echo delete node1
rd /s /q %file_path%\distNode1_0\data %file_path%\distNode1_0\wal %file_path%\distNode1_0\log 
rd /s /q %file_path%\distNode1_1\data %file_path%\distNode1_1\wal %file_path%\distNode1_1\log 
rd /s /q %file_path%\distNode1_2\data %file_path%\distNode1_2\wal %file_path%\distNode1_2\log 
ping -n 1 127.1>nul

:: (3)启动节点。数据节点有两组、每组三个;管理节点有一个。共7个节点
echo start node0
start  "0-0" %file_path%\distNode0_0\bin\store.exe
ping -n 1 127.1>nul
start  "0-1" %file_path%\distNode0_1\bin\store.exe
ping -n 1 127.1>nul
start  "0-2" %file_path%\distNode0_2\bin\store.exe
ping -n 1 127.1>nul

echo start node1
start  "1-0" %file_path%\distNode1_0\bin\store.exe
ping -n 1 127.1>nul
start  "1-1" %file_path%\distNode1_1\bin\store.exe
ping -n 1 127.1>nul
start  "1-2" %file_path%\distNode1_2\bin\store.exe
ping -n 1 127.1>nul

echo "请确保dnode启动完成,按任意键启动mnode..."
pause > nul
start "mnode" %file_path%\cm\bin\cm.exe
echo "启动完成,本脚本即将退出..."
ping -n 3 127.1>nul
exit -1

参考链接

  1. .bat脚本基本命令语法
posted @ 2021-11-25 15:17  lkf-newlife  阅读(233)  评论(0编辑  收藏  举报