• 在多个服务器跑程序经验之批处理顺序、分支、循环结构


         最近在做分布式存储计算的项目,由于涉及到多个服务器(72台),多个客户端,为了让这些服务器还有客户端能够自动化执行,统一管理(不知道有没有这样的软件,好像没有,现在我只能开着开60多个远程桌面,谁知道有这样的管理软件的推荐一下,thanks!)。

    我现在的解决方案是:

    1,批处理来进行发布新版本、获取执行结果

    2,在每个机器上部署一个自定义的window service 来监听并接收sokect命令并处理(启动、中断、关闭分布程序)

          批处理的基本知识我们在批处理入门 一文中已经做过介绍(不明白的同学请再去看看),下面我就按我这段时间每天工作流程所用的批处理给大家分享,一起来体验它的方便,高效性,自动化。

    (1) ,第一步,当然是先打开远程桌面啦(循环结构)

    @echo off
    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

    Code

    (2) ,发布新版本到指定的位置,其实就是copy(顺序结构)

    @echo on                                                                                                                                                                                                                     
    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之后再说)

    @echo off
    ClientAPP
    .exe /I:20080822_1112_1_100000.txt /T:24 /EWP:+
    echo %time>> log.txt
    pause

     启动程序,并指定参数,我这个程序三输入数据和线程数及是否记录到windows performmance panel(当然这是跟你的程处理有关)

    语法说明:echo >> 内容 >>  保存到的文件,这是将内容追加到文件中(>>为追加而>为覆盖),如例子中将程序完成时间写到log.txt文件中


     (4),保持文件的清洁,删除一些程序run过程中产生的文件(分支和循环结构)

    @echo on
    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回来

    @echo off
    set localLogPath=Servers-Perflog\
    For /f %%C in (ServerMachinelist.txt) do xcopy/e/\\%%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

    @echo on

    For /"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

    @echo on
    SET loadingPorjectEndTimeOflastClient=%1
    call "4 perfLog run_clientsLoadingtat(input time).cmd" %loadingPorjectEndTimeOflastClient%

    语法说明: 参数1:%1,参数2:%2....依此类推

    (6),如何让批处理sleep一下呢?

    我没找到批处理中有这个命令,不过一般的做法就是自己定一个sleep的程序,然后先调用它来等待。因为批处理总是从上到下的处理顺序

    ::调用sleepapp.exe来等待3600s
    SleepApp.exe /T:3600

    ::接着要执行的命令

    PAUSE

    总结,以上的我例子选择了我工作中几个步骤的片断,其中有定义变量,参数使用,顺序,分支循环结构,我想学会这几点就可以开始用它来工作了。哈哈......,我们学一门语言的时候刚刚开始不就是这些嘛~!下面有空我会把这个windows service的程序和大家分享。这样再多的服务器也不怕了,因为有了批处理和service等待来命令(而这个命令又是一些批处理呵呵)。

  • 相关阅读:
    Android OpenGL(2)
    Bootloader:BareBox
    Android OpenGL(1)
    Android脚本环境
    Android用户界面开发:事件处理
    S5PV210按键控制LED
    S5PV210控制蜂鸣器
    Windows Vista/Windows 7上安装wince5.0/6.0及SDK模拟器
    Makefile
    每日英语:Apps Reorder the Job Landscape
  • 原文地址:https://www.cnblogs.com/luyinghuai/p/1290045.html
Copyright © 2020-2023  润新知