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 中的变量
-
常用的系统变量
$HOME
、$PWD
、$SHELL
、$USER
等# 样例 echo $HOME echo $PWD echo $SHELL echo $USER
-
自定义变量
- 变量定义规则
- 变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写
- 等号两侧不能有空格
- 在 bash 中,变量默认类型都是字符串类型,无法直接进行数值运算
- 变量的值如果有空格,需要使用双引号或单引号括起来
- 基于语法
- 定义变量:
变量=值
- 撤销变量:
unset 变量
- 声明静态变量:
readonly 变量
(注意:不能 unset)
- 定义变量:
- 变量定义规则
-
特殊变量
$n
:n 为数字,$0
代表该脚本名称,$1-$9
代表第一到第九个参数;十以上的参数需要用大括号包含,如${10}
$#
:获取所有输入参数个数,常用于循环$*
:代表命令行中所有的参数,$*
把所有的参数看成一个整体$@
:也代表命令行中所有的参数,不过$@
把每个参数区分对待$?
:最后一次执行的命令的返回状态。如果这个变量的值为 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
运算符
-
基本语法
$((运算式))
或$[运算式]
expr +,-,\*,/,%
,加、减、乘、除、取模运算。注:expr 运算符间要有空格
-
样例
[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
条件判断
-
基本语法:
[ condition ]
。注意事项如下condition
前后要有空格- 条件非空即为 ture。如 [ aaa ] 返回true,[] 返回 false
-
常用判断条件
-
两个整数之间比较
命令 说明 = 字符串比较 -lt (less than) 小于 -le (less equal) 小于等于 -eq (equal) 等于 -gt (greater than) 大于 -ge (greater equal) 大于等于 -ne (not equal) 不等于 -
按照文件权限进行判断
命令 说明 -r (read) 有读的权限 -w (write) 有写的权限 -x (execute) 有执行的权限 -
按照文件类型进行判断
命令 说明 -e (existence) 文件存在 -f (file) 文件存在并且是一个常规的文件 -d (directory) 文件存在并且是一个目录 -
多条件判断
&&
表示前一条命令执行成功时,才执行后一条命令||
表示上一条命令执行 失败后,才执行下一条命令
-
-
样例
# 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 读取控制台输入
-
语法:
read [选项] [参数]
- 选项:
-p
指定读取值时的提示符;-t
指定读取值时等待的时间(秒);-n
指定读入有效字符的数个 - 参数:
变量
指定读取值的变量名
- 选项:
-
样例
[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
函数用法
-
系统函数
-
basename [string/pathname] [suffix]
,basename 命令会删掉所有的前缀包括最后一个("/")字符,然后将字符串显示出来。选项 suffix 为后缀,如果 suffix 被指定了,basename 会将 pathname 或 string 中的 suffix 去掉。 -
dirname 文件绝对路径
,从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分) -
样例
[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
-
-
自定义函数
-
语法
[ function ] funname[()] { Action; [return int;] } funname # 经验技巧 # (1) 必须在调用函数地方之前,先声明函数,shell 脚本是逐行运行。不会像其它语言一样先编译 # (2) 函数返回值,只能通过$?系统变量获得,可以显示加 return 返回,如果不加,将以最后一条命令运行结果,作为返回值。return 后跟数值 n(0-255)
-
样例
# 需求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 判断
-
语法
if [ condition ];then 程序 fi # 或者 if [ condition ] then 程序 fi # 注意事项 # (1) [ condition ],中括号和条件判断式之间必需有空格 # (2) if 后要有空格
-
样例
# 需求:输入一个数字,若是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 语句
-
语法
case $变量名 in "值1") 如果变量的值等于值 1,则执行程序 1 ;; "值2") 如果变量的值等于值 2,则执行程序 2 ;; ...省略其他分支... *) 如果变量的值都不是以上的值,则执行此程序 ;; esac # 注意事项 # (1) case 行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束 # (2) 双分号“;;”表示命令序列结束,相当于 java 中的 break # (3) 最后的“*)”表示默认模式,相当于 java 中的 default
-
样例
# 需求:输入一个数字,若是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 循环
-
语法
for (( 初始值;循环控制条件;变量变化 )) do 程序 done # 或者 for 变量 in 值1 值2 值3... do 程序 done
-
样例
# 需求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 循环
-
语法
while [ condition ] do 程序 done
-
样例
# 需求:求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 使用样例
样例一:微服务打包发布
-
打包
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
-
整理
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"
-
上传
scp.bat
# cmd 下使用 scp 命令即可,例如 scp 2021-10-15-10-18-07/* root@192.168.241.136:/tmp
-
启动
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 的目的
-
终止
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 概述
- 批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理,通常被认为是一种简化的脚本语言,它应用于 DOS (Disk Operating System,磁盘操作系统)和 Windows 系统中。批处理文件的扩展名为
.bat
- 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 和
::
- rem 为注释命令,一般用来给程序加上注解,该命令后的内容不被执行,但能回显(@rem 则不回显)。
::
也可以起到rem 的注释作用, 而且更简洁有效
- 注意
- 任何以冒号(
:
)开头的字符行, 在批处理中都被视作标号, 而直接忽略其后的所有内容。- 有效标号:冒号后紧跟一个以字母数字开头的字符串,goto语句可以识别。
- 无效标号:冒号后紧跟一个非字母数字的一个特殊符号,goto无法识别的标号,可以起到注释作用。所以
::
常被用作注释符号,其实:+
也可起注释作用。
- 与 rem 不同的是,
::
后的字符行在执行时不会回显, 无论是否用echo on
打开命令行回显状态, 因为命令解释器不认为他是一个有效的命令行, 就此点来看, rem 在某些场合下将比::
更为适用; 另外, rem 可以用于config.sys
文件中。 - 行内注释格式:
%注释内容%
(不常用,慎用)
- 任何以冒号(
echo 和 @
-
@ 字符放在命令前将关闭该命令回显,无论此时 echo 是否为打开状态。 (因此 @rem 不回显)
-
echo用法
序号 命令 作用 1 echo on / off 打开回显或关闭回显功能 2 echo 查看当前 echo 状态 3 echo msg 输出提示信息 4 echo.
空行 / 回车 5 echo 文件内容 > 文件名
创建文件 6 echo 文件内容 >> 文件名
追加内容 -
样例
D:\>echo hello,world > hello.txt # 创建 hello.txt 文件,内容为 hello,world D:\>echo hello,bat >> hello.txt # 在 hello.txt 文件中,追加 hello,bat 内容
color
-
color [attr]
, attr 用于指定控制台输出的颜色属性 -
颜色属性由两个十六进制数字指定,第一个为背景色,第二个则为前景色。每个数字可以为以下任何值之一
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
参考链接