影刀RPA 系统服务监控:Windows服务状态检测与自动恢复
影刀RPA 系统服务监控Windows服务状态检测与自动恢复作者林焱什么情况用这个运维和IT支持岗位的同学经常遇到这个场景公司内网某台服务器的关键服务比如数据库、IIS、打印服务莫名其妙挂了等有人报障了才发现然后手忙脚乱去重启。如果你负责维护多台Windows服务器每台上面跑着十几个服务你不可能24小时盯着服务面板。更麻烦的是有些服务假死——状态显示正在运行但实际上已经不响应请求了。光看服务状态还不够你得验证服务实际是否可用。这种场景用影刀RPA做一个系统服务监控机器人定时巡检所有目标服务器的关键服务发现异常自动重启并推送告警省心又靠谱。怎么做第一步定义监控目标先规划好你要监控哪些服务器的哪些服务。建议用Excel维护一张服务清单服务器IP服务名称显示名称优先级端口验证192.168.1.10MSSQLSERVERSQL Server高1433192.168.1.10W3SVCIIS服务高80192.168.1.20Spooler打印服务中—192.168.1.30MySQL80MySQL数据库高3306第二步远程查询服务状态在影刀中使用Python节点执行远程服务查询。核心思路是通过WMIWindows Management Instrumentation远程查询目标机器的服务状态importsubprocessimportjsondefquery_service_status(server_ip,service_name,username,password): 通过WMI远程查询Windows服务状态 # 使用sc命令远程查询需要目标机器开启远程服务管理cmdfsc \\\\{server_ip}query {service_name}try:resultsubprocess.run(cmd,shellTrue,capture_outputTrue,textTrue,timeout10)outputresult.stdout[video(video-ch0x0JDy-1784656172684)(type-csdn)(url-https://live.csdn.net/v/embed/526818)(image-https://v-blog.csdnimg.cn/asset/582d14c3bd0451c5399cd990b56e2a0d/cover/Cover0.jpg)(title-拼多多店群自动化报活动上架)]# 解析服务状态ifRUNNINGinoutput:return运行中elifSTOPPEDinoutput:return已停止elifSTART_PENDINGinoutput:return启动中elifSTOP_PENDINGinoutput:return停止中else:returnf未知状态:{output[:100]}exceptsubprocess.TimeoutExpired:return查询超时exceptExceptionase:returnf查询失败:{str(e)}第三步端口连通性验证光查服务状态还不够。很多服务显示运行但实际挂了需要做端口验证importsocketdefcheck_port(server_ip,port,timeout3):检测目标端口是否可连通try:socksocket.socket(socket.AF_INET,socket.SOCK_STREAM)sock.settimeout(timeout)resultsock.connect_ex((server_ip,int(port)))sock.close()returnresult0# 0表示连接成功exceptExceptionase:returnFalse第四步自动重启异常服务发现服务挂了自动尝试远程重启defrestart_service(server_ip,service_name):远程重启Windows服务# 先尝试启动start_cmdfsc \\\\{server_ip}start {service_name}try:resultsubprocess.run(start_cmd,shellTrue,capture_outputTrue,textTrue,timeout30)# 检查启动结果ifSUCCESSinresult.stdoutor已经在运行inresult.stdout:returnTrue,启动成功elif1060inresult.stdout:# 错误码1060指定的服务未安装returnFalse,服务不存在elif1058inresult.stdout:# 错误码1058服务已禁用returnFalse,服务已禁用无法启动else:returnFalse,f启动失败:{result.stdout[:200]}exceptExceptionase:returnFalse,f重启异常:{str(e)}第五步影刀流程串联用影刀的可视化指令编排整个巡检流程【读取Excel】→ 读取服务清单表获取所有监控目标【ForEach循环】→ 遍历每一行服务记录【Python节点】→ 执行query_service_status()查询状态【IF条件判断】→ 状态不是运行中进入告警分支【Python节点】→ 执行restart_service()尝试恢复【IF条件判断】→ 如果有配置端口执行check_port()验证【Python节点】→ 汇总异常记录【发送企业微信消息】→ 将异常服务列表推送到运维群第六步巡检报告生成每次巡检完成后生成一份巡检报告并存档importdatetimedefgenerate_report(check_results,output_path):生成巡检报告nowdatetime.datetime.now().strftime(%Y-%m-%d %H:%M:%S)totallen(check_results)normalsum(1forrincheck_resultsifr[状态]正常)abnormaltotal-normal recoveredsum(1forrincheck_resultsifr.get(自动恢复)成功)reportf 服务巡检报告 巡检时间:{now}巡检范围:{total}个服务 正常:{normal}个 异常:{abnormal}个 自动恢复成功:{recovered}个 --- 异常详情 --- forrincheck_results:ifr[状态]!正常:reportf 服务器:{r[服务器]}服务名:{r[服务名称]}状态:{r[状态]}处理:{r.get(处理结果,未处理)}端口验证:{r.get(端口验证,未配置)}# 写入文件report_pathf{output_path}/服务巡检_{now.replace(:,-)}.txtwithopen(report_path,w,encodingutf-8)asf:f.write(report)returnreport,report_path有什么坑坑一WMI权限不足现象sc命令远程查询时报拒绝访问原因远程服务管理需要目标机器的管理员权限而你的影刀运行账号可能权限不够。解决在目标服务器上用secpol.msc打开本地安全策略确保运行账号有从网络访问此计算机的权限使用runas或指定凭据sc \\服务器IP query 服务名之前先建立IPC连接# 先建立IPC连接net_use_cmdfnet use \\\\{server_ip}/user:{username}{password}subprocess.run(net_use_cmd,shellTrue,capture_outputTrue)# 再执行sc命令# ...# 用完后断开连接subprocess.run(fnet use \\\\{server_ip}/delete,shellTrue)坑二服务依赖链现象重启服务A成功但服务A依赖的服务B没启动导致A又挂了。原因Windows服务之间有依赖关系重启时需要按依赖顺序操作。解决使用sc qc查询服务的依赖关系重启前先检查依赖服务状态defget_service_dependencies(server_ip,service_name):查询服务依赖cmdfsc \\\\{server_ip}qc {service_name}resultsubprocess.run(cmd,shellTrue,capture_outputTrue,textTrue)deps[]forlineinresult.stdout.split(\n):ifDEPENDENCIESinline:# 提取依赖服务名dep_partline.split(:)[-1].strip()ifdep_part:deps[d.strip()fordindep_part.split(/)ifd.strip()]returndeps# 重启前先检查并启动所有依赖服务depsget_service_dependencies(server_ip,service_name)fordepindeps:statusquery_service_status(server_ip,dep,username,password)ifstatus!运行中:restart_service(server_ip,dep)坑三假死服务检测遗漏现象服务显示运行中端口也通但业务功能不正常。TEMU店群矩阵自动化运营核价报活动原因纯端口检测只能验证TCP连接无法验证应用层响应。解决对关键业务服务增加业务探针——发送一个实际请求看是否返回预期内容importrequestsdefhttp_health_check(url,expected_keyword,timeout5):HTTP业务探针try:resprequests.get(url,timeouttimeout)ifresp.status_code200andexpected_keywordinresp.text:returnTrue,业务正常elifresp.status_code200:returnFalse,f页面返回正常但未找到关键字{expected_keyword}else:returnFalse,fHTTP状态码异常:{resp.status_code}exceptrequests.exceptions.Timeout:returnFalse,请求超时exceptExceptionase:returnFalse,f探针异常:{str(e)}坑四重启风暴现象服务重启后又挂了机器人再次检测、再次重启陷入死循环。原因没有设置重试上限和保护间隔。解决给每个服务记录重启次数超过阈值不再自动重启改为告警人工介入importjsonimportos# 在流程中维护一个重启计数器restart_counter{}MAX_RESTART_COUNT3# 最大自动重启次数RESET_INTERVAL_MINUTES60# 计数器重置间隔defshould_restart(service_key):判断是否应该自动重启nowtime.time()ifservice_keynotinrestart_counter:restart_counter[service_key]{count:0,first_time:now}recordrestart_counter[service_key]# 如果超过重置间隔清零重新计数ifnow-record[first_time]RESET_INTERVAL_MINUTES*60:record[count]0record[first_time]nowifrecord[count]MAX_RESTART_COUNT:returnFalse# 超过阈值不再自动重启record[count]1returnTrue坑五跨网段防火墙问题现象有些服务器能连通有些超时。原因Windows远程服务管理依赖135/445等端口跨网段时防火墙可能拦截。解决确保目标服务器开启了远程服务管理防火墙规则备选方案在目标机器上部署一个轻量Agent脚本由影刀通过HTTP触发Agent在本机操作服务# 备选通过HTTP调用目标机器上的Agentimportrequestsdefagent_restart_service(agent_url,service_name,api_key):通过轻量Agent重启服务resprequests.post(f{agent_url}/api/service/restart,json{service_name:service_name},headers{X-API-Key:api_key},timeout10)returnresp.json()总结影刀RPA做Windows服务监控的核心价值在于自动发现自动恢复自动告警三位一体。相比Zabbix、Prometheus等专业监控工具影刀的优势是部署轻量、配置灵活、无需学习复杂的监控平台。对于10-50台Windows服务器的中小企业运维场景完全够用且零额外成本。