最近在做分布式存储计算的项目,由于涉及到多个服务器(72台),多个客户端,为了让这些服务器还有客户端能够自动化执行,统一管理(不知道有没有这样的软件,好像没有,现在我只能开着开60多个远程桌面,谁知道有这样的管理软件的推荐一下,thanks!)。
我现在的解决方案是:
1,批处理来进行发布新版本、获取执行结果
2,在每个机器上部署一个自定义的window service 来监听并接收sokect命令并处理(启动、中断、关闭分布程序)
批处理的基本知识我们在批处理入门 一文中已经做过介绍(不明白的同学请再去看看),下面我就按我这段时间每天工作流程所用的批处理给大家分享,一起来体验它的方便,高效性,自动化。
(1) ,第一步,当然是先打开远程桌面啦(循环结构)
For / f %%C in ( ServerMachinelist . txt ) do start mstsc / v: %%C / w: 1208 / h: 768
echo open ok
ServerMachinelist.txt文件中列出了所以要打开的机器名或者ip,
语法说明:循环:for %%C ... do ...%%C,其中%%C是 ServerMachinelist.txt文件中的一行数据, 如machine1;mstsc /v:机器名 /W:窗口宽 /H:高
记得加上start呀,这样不影响循环往下走
ServerMachinelist.txt
![ContractedBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
machine1
machine2
machine3
machine4
machine5
machine6
machine7
machine8
machine9
machine10
machine11
machine12
machine13
machine14
machine15
machine16
machine17
machine18
machine19
machine20
machine21
machine22
machine23
machine24
machine25
machine26
machine27
machine28
machine29
machine30
machine31
machine32
machine33
machine34
machine35
machine36
machine37
machine38
machine39
machine40
machine41
machine42
machine43
machine44
(2) ,发布新版本到指定的位置,其实就是copy(顺序结构)
xcopy / e / i \\ Machine28 \ d $\ temp \\ Machine616 \ d $\( 080814 ) projectV1 . 0.0 / y
xcopy / e / i \\ Machine28 \ d $\ temp \\ Machine617 \ d $\( 080814 ) projectV1 . 0.0 / y
xcopy / e / i \\ Machine28 \ d $\ temp \\ Machine618 \ d $\( 080814 ) projectV1 . 0.0 / y
xcopy / e / i \\ Machine28 \ d $\ temp \\ Machine619 \ d $\( 080814 ) projectV1 . 0.0 / y
xcopy / e / i \\ Machine28 \ d $\ temp \\ Machine620 \ d $\( 080814 ) projectV1 . 0.0 / y
:: 其它的略
echo copy Ok
上面也可以用for语句来写,为了看看这些例子,还是用顺序的形式
语法说明:xcopy就不用讲了当然是完全copy了,包括子目录和文件
(3) ,程序已经布发了,当然要开始run了(以单个机器上的批处理为例,如何集中控制我们下一遍讲到window service之后再说)
ClientAPP . exe / I:20080822_1112_1_100000 . txt / T: 24 / EWP: +
echo % time % >> log . txt
pause
启动程序,并指定参数,我这个程序三输入数据和线程数及是否记录到windows performmance panel(当然这是跟你的程处理有关)
语法说明:echo >> 内容 >> 保存到的文件,这是将内容追加到文件中(>>为追加而>为覆盖),如例子中将程序完成时间写到log.txt文件中
(4),保持文件的清洁,删除一些程序run过程中产生的文件(分支和循环结构)
For / f %%C in ( ClientMachinelist . txt ) do if exist \\ %%C \ d $\ ( 080909 ) Porject1 . 0.0 \ Monitor \ * . txt del \\ %%C \ d $\( 080909 ) Porject1 . 0.0 \ Monitor \ * . txt
echo del ok
cmd
意思是遍历ClientMachinelist.txt文件中的所的服务器(跟(1)中ServerMachinelist.txt文件格式一样),检查文件夹(080909)Porject1.0.0\Moniter下是否有txt文件,有则删除。
(5),将每台服务器的performace log 拷贝到本地,并进行分析(批处理中使用参数和定义变量)
<1>copy log回来
set localLogPath = Servers-Perflog \
For / f %%C in ( ServerMachinelist . txt ) do xcopy / e / i \\ %%C \ c $\ perflogs \ local-Store* . csv %localLogPath% \ %%C / y
echo copy server's performance log ok
语法说明:声明变量的格式:set 变量名=内容(注意=两边不能有空格)
<2>调用别的bat文件并传递参数
主调批处理文件all only analysis loading client perf.bat
For / f " delims=; " %%C in ( log . txt ) do call " only analysis loading client perf.bat " " %%C "
cmd
语法说明:call命令用来调用现有的批处理文件;格式:call 批处理文件名 参数
log.txt是(3)中程序结构后打的结束时间日志。
被调的bat文件 only analysis loading client perf.bat
SET loadingPorjectEndTimeOflastClient = %1
call " 4 perfLog run_clientsLoadingtat(input time).cmd " %loadingPorjectEndTimeOflastClient%
语法说明: 参数1:%1,参数2:%2....依此类推
(6),如何让批处理sleep一下呢?
我没找到批处理中有这个命令,不过一般的做法就是自己定一个sleep的程序,然后先调用它来等待。因为批处理总是从上到下的处理顺序
SleepApp . exe / T: 3600
:: 接着要执行的命令
![](https://www.cnblogs.com/Images/dot.gif)
PAUSE
总结,以上的我例子选择了我工作中几个步骤的片断,其中有定义变量,参数使用,顺序,分支循环结构,我想学会这几点就可以开始用它来工作了。哈哈......,我们学一门语言的时候刚刚开始不就是这些嘛~!下面有空我会把这个windows service的程序和大家分享。这样再多的服务器也不怕了,因为有了批处理和service等待来命令(而这个命令又是一些批处理呵呵)。