起因
:公司的几台服务器的数据库都做了异地备份,因为备份服务器未开放公网,只能通过VPN连接之后才能访问,
起初通过“计划任务 + 维护计划 + 自动断连VPN的脚本 ”来实现自动备份的。整体还算稳定,但是有一天遇到一个尴尬的问题,待服务器断网了,我们的机房当天又无人值守,就造成了失控的情况,因为服务器在离线运行···
需求
:服务器自动检测网络运行状况,一旦断网,先尝试重启网络,如果网络依然未恢复就会重启计算机(曾尝试重启网络设备,但是需要借助第三方软件,感觉太麻烦,重启服务器慢就慢点吧);另外服务器还要在指定时间内连接VPN(注意这里的VPN连接方式为“点对点隧道连接”,请参照“指定VPN定时自动连接+断开脚本”),为计划任务的执行做准备,并检测VPN的连接状态,如果出现问题,执行等同上方的解决方案。
过程
:这个脚本耗时近两天的时间,主要原因在于刚开始的时候被没有画思维导图,导致脚本写着逻辑就混乱了,而且存放在脑海中的逻辑还存在一些问题,脚本也是改来改去,前前后后改了不下十个版本,改到最后自己都晕了。同时,语法问题的排查耗费了近1/3的时间,主要就是语法不熟悉,查起来相当之费劲。最终还是完成的前一天晚上开始画了思维导图的初稿,第二天根据思维导图改脚本,感觉不合理的地方再反过来改导图,最终才有了下面的思维导图。
总结
:如再需要写类似的脚本时,一定先把思维导图尽可能的定下来,然后再去写,否则效率会低很多,而且逻辑出现问题的几率很大。
下面的这个工具就微软提供的可以重启网络设备的软件(这里并未使用,而只是重启网络服务):点击下载DevCon.exe,点击查看DevCon的用法介绍。
解压到桌面会看到里面有三个文件,然后将适合自己系统版本的devcon.exe放到“C:Windowssystem32”文件夹下,这样运行devcon.exe可以直接使用devcon了。
脚本内容如下,脚本(名称:NetAutoCheck.bat)的内容注释的很详细,当然初始化数据中的VPN账户和密码以及其他部分数据可以根据自己的情况修改,参数的含义都有详细说明。
@echo =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
@echo =*= 此脚本是为了让网络可以自动检测是否畅通,
@echo =*= 并在指定时间段内连接VPN并保持连接。
@echo =*= 一旦网络出现问题,会先尝试重启网卡,
@echo =*= 如果网络问题还未解决将重启主机。
@echo =*= 更新于2016年10月10日14:09:28;
@echo =*= 联系方式:1009700469
@echo =*= 此脚本将会保持持续运行,只有手动关闭。
@echo =*= 请严格按照时间格式填写,这里做验证太麻烦!!
@echo =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
@rem rem:在批处理文件或 CONFIG.SYS 里加上注解或说明。
@rem 初始化数据
:InitParam
@rem 用于测试网络和VPN的内外网地址
@set OutUrl=www.baidu.com
@set InUrl=192.168.2.8
@rem VPN账户名和密码
@set VpnCount=vpncount
@set VpnPwd=vpnpassword
@rem ping一次的次数和一次发送的字节数
@set PingCount=4
@set PingCountMax=10
@set PingByteSize=1
@rem 起止时间
@set start=00:01:00
@set end=20:20:00
@rem VPN状态(0:断;1:通)
@ping %InUrl% -l %PingByteSize% -n %PingCount% && ( set VpnState=1 ) || ( set VpnState=0 )
@rem 设置起止时间
:SetStartTime
@set /p temp=请输入合法的起始时间(24小时制),格式:HH:mm:ss
@rem 如果输入不为空则将输入值赋值给起止时间
@if defined %temp% set start=%temp%
@echo 默认起始时间 %start%
@if %start:~0,2% lss 0 goto SetStartTime
@if %start:~0,2% gtr 24 goto SetStartTime
@if %start:~3,2% lss 0 goto SetStartTime
@if %start:~3,2% gtr 60 goto SetStartTime
@if %start:~6,2% lss 0 goto SetStartTime
@if %start:~6,2% gtr 60 goto SetStartTime
@if not %start:~2,1%==: goto SetStartTime
@if not %start:~5,1%==: goto SetStartTime
:SetEndTime
@set /p temp=请输入合法的截止时间(24小时制),格式:HH:mm:ss
@if defined %temp% set end=%temp%
@echo 默认截止时间 %end%
@if %end:~0,2% lss 0 goto SetEndTime
@if %end:~0,2% gtr 24 goto SetEndTime
@if %end:~3,2% lss 0 goto SetEndTime
@if %end:~3,2% gtr 60 goto SetEndTime
@if %end:~6,2% lss 0 goto SetEndTime
@if %end:~6,2% gtr 60 goto SetEndTime
@if not %end:~2,1%==: goto SetEndTime
@if not %end:~5,1%==: goto SetEndTime
@rem 检测网络(正常:检查时间段 - CheckTime;异常:重启网卡)
:CheckNet
@rem -l size:发送缓冲区字节数大小,如下面就是发送的数据大小就是1个字节;-n count:要发送的回显请求数;-w timeout:等待每次回复的超时时间(毫秒);
@ping %OutUrl% -l %PingByteSize% -n %PingCount% && goto CheckTime || goto RestartNet
@rem ELSE 子句必须出现在同一行上的 IF 之后,如:IF EXIST filename. (del filename.) ELSE echo filename. missing
@rem %date%的格式:2016/10/10 周一; %time%的格式:11:32:53.13
@rem EQU - 等于
@rem NEQ - 不等于
@rem LSS - 小于
@rem LEQ - 小于或等于
@rem GTR - 大于
@rem GEQ - 大于或等于
@rem 检测时间段(符合:连接VPN;否则:断开VPN)
:CheckTime
@if %time% gtr %start% ( if %time% lss %end% ( goto OnVPN ) else goto OffVPN ) else goto OffVPN
@rem 连接VPN(成功:检测VPN;失败:重启网卡)
:OnVPN
@if %VpnState% equ 1 goto CheckVPN
@rasdial VPN %VpnCount% %VpnPwd% && goto CheckVPN || goto CheckTime
@rem 断开VPN(正常:检测网络;异常:检测网络)
:OffVPN
@if %VpnState% equ 0 goto CheckNet
@rasdial VPN /disconnect && goto CheckNet
@rem 检测VPN(正常:检查时间段;异常:检测网络)
:CheckVPN
@ping %InUrl% -l %PingByteSize% -n %PingCount% && ( set VpnState=1 && goto CheckTime) || ( set VpnState=0 && goto CheckNet)
@rem 重启网卡(之后再测网络)
:RestartNet
@ipconfig -release & ipconfig -renew
@ping %InUrl% -l %PingByteSize% -n %PingCount% && ( set VpnState=1 ) || ( set VpnState=0 )
@goto CheckNetAgain
@rem echo **** 网络异常,正在尝试重启网络设备,请稍等…… ****
@rem devcon disable=net
@rem devcon enable=net
@rem set VpnState=0
@rem goto CheckNetAgain
@rem 再测网络(正常:检测时间段;异常:重启主机)
:CheckNetAgain
@ping %OutUrl% -l %PingByteSize% -n %PingCountMax% && goto CheckTime || goto RestartHost
@rem 重启主机
:RestartHost
@echo **** 网络异常,即将重启主机,稍后再见…… ****
@shutdown -r -t 0
将脚本拷贝到需要网络自检功能的服务器,以管理员身份运行即可。如果不喜欢DOS窗口在那碍眼,那么接下来要做的就是让 bat 转为后台运行。
创建一个记事本,命名为StartAutoCheck,后缀改为vbe(前提是可以看到后缀,文件夹的查看中可以设置);
用记事本打开文件,或者直接编辑,内容为:
set ws=wscript.createobject("wscript.shell")
ws.run "NetAutoCheck.bat /start",0
将该文件跟上面的脚本文件放到同一目录下,直接运行该文件调用脚本即可让脚本后台运行。
虽然ping的过程中收发的数据量很少,一次一个字节,但是实际运行中感觉对网络的性能影响挺大,并不适合实时运行,可以考虑跟计划任务组合,让其十分钟运行一次(时间自行设置)。
声明:此脚本仅为本人解决个人所需而写,并未经过专业测试,如果只是放在测试服务器上可以,重要的服务器请慎重,以免造成损失!!
Willem King 更新于2016年10月11日14:38:55
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。