用批处理解决“运维常见问题之服务意外停止”

0x1 服务异常

某公司为规范办公室安全管理,为各办公室安装门禁并给员工制定不同的进出权限。
但近期运维发现更新权限后并不能与门禁控制器同步,导致权限异常。

0x2 排查问题,定位问题

出现同步问题后首先去设备监控页面检查设备同步状态,在设备状态页面提示数据中心检测服务未启动
如下图
服务未启动.jpg
在服务器上查看服务状态,这货“ZKECO Data Comm Center Service”果然已经罢工了
Data Center.jpg

0x3 制定解决问题的方法

启动这个服务后问题立刻解决,于是想着有什么办法能够一直检测服务状态类似“服务看家狗”这样的东东。
尝试着使用WIN自带的批处理来解决,就必须为服务添加一个判断状态。全部代码如下:

@echo off
::检测服务运行状态,若运行中则不处理,若停止则启动
for /f "skip=3 tokens=4" %%i in ('sc query ZKECODataCommCenterService') do set "zt=%%i" &goto :next
:next
if /i "%zt%"=="RUNNING" (
    echo 已经发现该服务在运行。
) else (
    echo 该服务现在处理停止状态。
    ::自行设定服务名
    net start ZKECODataCommCenterService
)
pause>nul

通过判断“ZKECODataCommCenterService”运行状态,运行状态等于RUNNING时服务正常,如发现状态不等于RUNNING时判断服务停止则执行“net start ZKECODataCommCenterService”动作 启动服务。

最后再把这个批处理加入到任务计划中每隔1小时检查一次,这样就保证了服务的可用性。

运行测试如下:
启动服务状态.jpg

服务启动成功.jpg

服务正常.jpg

0x4 假装有总结

这次的问题虽然通过批处理得到了很好的解决,但是由于时间紧迫,导致服务停止的根本原因并未查明。
同时有了上面批处理的思维,后期可以通过修改让其变得更加强大,多服务监测也不是不可能!
最后,如果加入到任务计划中需要关闭批处理的显示窗,此时需要注释掉暂停命令,像这样“::pause>nul”。

Last modification:September 7th, 2018 at 03:00 pm
如果觉得我的文章对你有用,请随意赞赏

9 comments

  1. 肥柴

    我觉得你应该发一点有趣的幽默内容了

    1. 拾玖
      @肥柴

      没有写段子的天赋啊

  2. 鸟屋

    运维大神

    1. 拾玖
      @鸟屋

      混口饭吃

      1. 鸟屋
        @拾玖

        不过你这个页面很卡唉

        1. 拾玖
          @鸟屋

          现在主机托管在香港的国内有些地方卡,以后想办法解决吧

          1. 鸟屋
            @拾玖

            香港主机延迟应该不高啊,或许你可以用oss或者cdn缓存资源

            1. 拾玖
              @鸟屋

              没有备案的连国内的cdn都用不了,还是等以后有时间迁到国内吧

              1. 鸟屋
                @拾玖

                嗯嗯,国内的主机也是挺便宜的

Leave a Comment