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
自定义变量
变量=值
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
前后要有空格常用判断条件
两个整数之间比较
命令 | 说明 |
---|---|
= | 字符串比较 |
-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
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
样例一:微服务打包发布
打包 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/* [email protected]:/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
.bat
序号 | 命令 | 作用 |
---|---|---|
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 的注释作用, 而且更简洁有效:
)开头的字符行, 在批处理中都被视作标号, 而直接忽略其后的所有内容。
::
常被用作注释符号,其实 :+
也可起注释作用。::
后的字符行在执行时不会回显, 无论是否用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"
样例一:微服务打包&运行
@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
参考链接