Windows服务意外停止的对策

来源 :硅谷 | 被引量 : 0次 | 上传用户:sentimantal
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  [摘要]针对Windows服务在运行过程中出现的意外停止的情况下实现无人值守定时检测服务状态,在服务停止后能自动启动服务。
  [关键词]服务 意外停止 对策
  中图分类号:TP3文献标识码:A文章编号:1671-7597(2009)0520032-02
  
  一、前言
  
  系统服务,是指执行指定系统功能的程序、例程或进程,以便支持其他程序,尤其是低层(接近硬件)程序,它是Windows系统的一个重要组成部分。
  我院在做医院管理系统与医疗保险系统接口过程中使用到一个外加进系统的医保服务,但该服务在实际使用过程中经常出现服务不定时的意外停止,该服务的停止必然导致门诊住院医保病员的就诊不能正常进行,也给计算机中心的管理带来了很大的挑战,每次服务停止后都必须在服务器上用手工执行启动后才能恢复正常,为恢复该服务必须到机房手工处理,有时甚至在深夜。针对这一情况,如何才能在无人值守的情况下实现对该服务做监视和启动处理操作呢?经过多次摸索,终于成功地利用VB的API函数及系统的计划任务配合实现在无人值守情况下服务的
  自动监视和服务停止后的自动启动。
  
  二、方法简介
  
  要实现对停止的服务重新启动,需要做到以下几个功能:
  1.定时处理:利用系统的任务计划指定程序定时执行一次,执行处理完成后直接退出程序。
  2.检测服务状态及重新启动服务:利用API函数构建的类模块实现对系统的服务状态进行服务状态的检测及停止状态下的再启动操作。
  3.文件的读写功能:用API函数实现对配置文件的读取,用write函数实现将启动服务事件以追加方式写入到历史
  文件中。
  
  三、程序实现
  
  (一)准备工作
  新建一个标准工程,名称为[服务类],在工程中创建一个窗体,名称为[frmService];在工程资源管理器中新建一个模块,名称为[mdlService];在工程资源管理器中新建一个类模块,名称为[clsService]。如图1所示。
  


  (二)程序代码
  1.窗体代码
  Option Explicit
  Private Sub Form_Load()
  iniPath = App.Path + "\service.ini"
  Dim mySrv As New clsService
  Dim tService As String
  '取需处理的服务
  tService = GetFromINI("需监控服务", "名称", iniPath)
  mySrv.Name = tService
  '当前服务状态,如处理停止状态则做启动处理,否则退出程序
  If mySrv.GetServiceStatus = SERVICE_STOPPED Then
  '如启动服务正常,则写入历史文件中备查
  If mySrv.StartNTService = 0 Then
  Open App.Path + "\服务历史.txt" For Append Shared As #1
  Write #1, Format(Now, "yyyy-mm-dd hh:mm:ss") & "-" & tService & "服务意外停止,已重新执行了启动。"
  Close #1
  End If
  End If
  End
  End Sub
  2.模块代码
  Option Explicit
  
  Public iniPath As String
  Public ServiceName As String
  Public Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, lpKeyName As Any, ByVal lpDefault As String, ByVal lpRetunedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
  Public Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long
  '取配置文件参数
  Public Function GetFromINI(AppName As String, KeyName As String, FileName As String) As String
   Dim RetStr As String
   RetStr = String(255, Chr(0))
   GetFromINI = Left(RetStr, GetPrivateProfileString(AppName, ByVal KeyName, "", RetStr, Len(RetStr), FileName))
  End Function
  3.类模块代码
  Option Explicit
  Private Const SC_MANAGER_CONNECT = &H1&
  
  Private Const SERVICE_QUERY_STATUS = &H4&
  Private Const SERVICE_START = &H10&
  
  Public Enum SERVICE_START_TYPE
  SERVICE_AUTO_START = 2&
  SERVICE_DEMAND_START = 3&
  SERVICE_DISABLED = &H4
  End Enum
  
  Public Enum SERVICE_STATE
  SERVICE_STOPPED = &H1
  SERVICE_START_PENDING = &H2
  SERVICE_STOP_PENDING = &H3
  SERVICE_RUNNING = &H4
  SERVICE_CONTINUE_PENDING = &H5
  SERVICE_PAUSE_PENDING = &H6
  SERVICE_PAUSED = &H7
  End Enum
  Private Type SERVICE_STATUS
  dwServiceType As Long
  dwCurrentState As Long
  dwControlsAccepted As Long
  dwWin32ExitCode As Long
  dwServiceSpecificExitCode As Long
  dwCheckPoint As Long
  dwWaitHint As Long
  End Type
  
  Private Declare Function OpenSCManager Lib "advapi32" Alias "OpenSCManagerW" _
  (ByVal lpMachineName As Long, ByVal lpDatabaseName As Long, _
  ByVal dwDesiredAccess As Long) As Long
  Private Declare Function OpenService Lib "advapi32" Alias "OpenServiceW" _
  (ByVal hSCManager As Long, ByVal lpServiceName As Long, _
  ByVal dwDesiredAccess As Long) As Long
  Private Declare Function QueryServiceStatus Lib "advapi32" (ByVal hService _
  As Long, lpServiceStatus As SERVICE_STATUS) As Long
  Private Declare Function CloseServiceHandle Lib "advapi32" _
   (ByVal hSCObject As Long) As Long
  Private Declare Function StartService Lib "advapi32" Alias "StartServiceW" _
   (ByVal hService As Long, ByVal dwNumServiceArgs As Long, _
   ByVal lpServiceArgVectors As Long) As Long
  
  Private Service_Name As String
  
  '查询服务运行状态,4运行,1停止
  Public Function GetServiceStatus() As SERVICE_STATE
  Dim hSCManager As Long, hService As Long, Status As SERVICE_STATUS
  hSCManager = OpenSCManager(0&, 0&, SC_MANAGER_CONNECT)
  If hSCManager Then
  hService = OpenService(hSCManager, StrPtr(Service_Name), SERVICE_QUERY_STATUS)
  If hService Then
  If QueryServiceStatus(hService, Status) Then
  GetServiceStatus = Status.dwCurrentState
  End If
  CloseServiceHandle hService
  End If
  CloseServiceHandle hSCManager
  End If
  End Function
  
  '开始服务
  Public Function StartNTService() As Long
  Dim hSCManager As Long, hService As Long
  hSCManager = OpenSCManager(0&, 0&, SC_MANAGER_CONNECT)
  If hSCManager Then
  hService = OpenService(hSCManager, StrPtr(Service_Name), SERVICE_START)
  If hService Then
  If StartService(hService, 0, 0) = 0 Then
  StartNTService = Err.LastDllError
  End If
  CloseServiceHandle hService
  Else
  StartNTService = Err.LastDllError
  End If
  CloseServiceHandle hSCManager
  Else
  StartNTService = Err.LastDllError
  End If
  End Function
  
  
  '服务名称
  Public Property Let Name(ByVal sSrvName As String)
  Service_Name = sSrvName
  End Property
  (三)文件处理
  新建一文本文件,改名为[Service.ini],且[Service.ini]要与[服务类.exe]文件放在同一个目录下,打开[Service.ini]文件在其中输入如下内容(注:此处用Alerter代替):
  [需监控服务]
  名称=Alerter
  (四)任务计划处理
  在“控制面板”中的“任务计划”中添加该可执行文件[服务类.exe]即可,按提示设定完成后,再在新增的任务计划中选择“高级计划选项”中选择“重复任务”,指定每隔多长时间即运行一次即可。若业务要求响应快,时间间隔就小一些,否则就长一些,时间间隔可根据需要自定。
  
  四、编程后记
  
  通过上述程序,能自动实现服务意外停止后的启动功能。该软件在Windows XP+VB6(SP6)环境下调试运行通运行。
其他文献
[摘要]介绍RTLinux下的设备驱动模型,以PCI接口的CAN卡为例详细描述了RTLinux下开发设备驱动程序的一般方法。并通过RTLinux与Linux下设备驱动程序开发过程的对比,描述两者的异同,给出将Linux下设备驱动源码更改为RTLinux设备驱动的方法。  [关键词]RTLinux 设备驱动 CAN  中图分类号:TP3文献标识码:A文章编号:1671-7597(2009)05200
期刊
[摘要]针对基于ASP开发的Web应用,比如网络教学系统,学生作业等大量信息传递时存在的系统“拥堵”问题,提出应用MSMQ技术的解决方案,以及在ASP应用程序中队列的建立、消息发送、消息读取的实现方法。  [关键词]Web应用 网络教学系统 消息队列 异步消息传递 ASP  中图分类号:TP3文献标识码:A文章编号:1671-7597(2009)0520043-01    ASP开发的应用系统,在
期刊
[摘要]随着计算机技术、光学、电子技术、视频技术、传送技术的发展,各种电子屏幕设备的应用日益增多。在众多的影像设备中,LED电子显示屏是集光电子技术、视频技术、计算机技术和微电子技术为一体的科技产品。LED因其强大的功能在各行各业中得到了广泛的应用。  [关键词]LED电子屏幕 多媒体控制  中图分类号:TN6文献标识码:A文章编号:1671-7597(2009)0520017-01    我国经
期刊
[摘要]主要从网页布局的标准,从传统表格布局的缺陷,到CSS布局的优点,以及CSS布局常见布局方式的分析进行论述。  [关键词]CSS DIV 布局 WEB标准  中图分类号:TP3文献标识码:A文章编号:1671-7597(2009)0520045-01    基于WEB标准的网站设计的核心在于如何使用众多WEB便准中的各项技术来达到表现与内容的分离,即网站的结构、表现和行为三者的分离。只有真正
期刊
[摘要]构建基于Moodle平台的英语网络课程设计,以学生学为主体,促进英语教学的发展。  [关键词]课程设计 自主学习 协作学习 Moodle  中图分类号:TJ8文献标识码:A文章编号:1671-7597(2009)0520044-01    随着信息化时代的到来,信息技术对教育产生了深刻的影响。信息技术与课程的整合成为教育发展的必然阶段,随着整合的深入,网络课程设计也成为信息技术与课程整合的
期刊
[摘要]随着Internet广泛应用,拥塞控制技术已成为网络研究热点之一,描述Internt端到端产生拥塞的基本原因,重点阐述TCP拥塞控制策略和拥塞控制四种算法的性能及应用,进一步分析TCP拥塞控制技术最新研究成果及方向。  [关键词]Internet TCP协议 拥塞控制 算法  中图分类号:TP3文献标识码:A文章编号:1671-7597(2009)0810062-02    随着Inter
期刊
[摘要]数字PID温度控制中,大功率脉冲信号干扰严重,影响控制精度。采用PID算法输出数字PWM控制量,将PWM信号整流成电压信号控制大功率三极管和串接热电阻丝的电流,消除大功率开关电流的影响;把功率三极管和热电阻丝共同作为加热源,提高电能转化成有用热能。该数字PID控制在提高精度的同时不降低效率,而且电路简洁。  [关键词]恒温控制 电磁干扰 PID算法  中图分类号:O44文献标识码:A文章编
期刊
[摘要]利用公钥密码技术为安全通信提供服务的基础平台的技术和规范提供基于非对称密钥密码技术的一系列安全服务,包括通信对象身份认证和密码管理、机密性、完整性、不可否认性和数字签名等务进行安全的信息交互,在线交易和互联网上的各种活动。  [关键词]公共密钥基础设施(PKI) 网络信息安全 证书 密钥  中图分类号:TP3文献标识码:A文章编号:1671-7597(2009)0520053-01    
期刊
[摘要]通过方法的讲解和具体举实例来说明在photoshop中的七种常见抠图技巧。  [关键词]套索 橡皮擦 魔术棒 快速蒙版 抽出滤镜 通道  中图分类号:TP3文献标识码:A文章编号:1671-7597(2009)0520052-01    随着数码相机的越来越普及,很多非专业人士都想尝试着自己设计照片,虽然现在有很多傻瓜式的处理图片的工具软件,但终究不如photoshop  这个专业软件处理
期刊
[摘要]Oracle数据库是一种使用广泛的数据库系统。当前,ORACLE作为大型数据库管理系统快速发展,但随即而来的是用户对Oracle的性能提出了更高的要求以求更好的发挥其强大的数据管理功能。由此,笔者将结合自身的经验,对Oracle数据库的优化理论基础,以及具体的优化方法进行探讨,希望对广大读者能有所启发。  [关键词]Oracle 数据库 参数优化 SQL  中图分类号:TP3文献标识码:A
期刊