none
在windows服务内,配置服务的属性

    问题

  • 开发环境:win7

    运行环境:win10

    应用类型:windows 服务

    描述:希望在服务中编写代码,配置服务在挂掉后,5秒后自动重启。在MSDN示例库中找打了一个示例,链接如下:https://code.msdn.microsoft.com/windowsapps/CSWindowsServiceRecoveryPro-2147e7ac。此示例包含一个ConsoleApp和一个windows服务,单独运行ConsoleApp可以对服务进行配置,配置无法挂掉后重启。但是修改代码,在服务中添加对服务本身的配置,会运行是出错。

    2016年9月14日 6:24

答案

  • 谢谢大家的 回复,找到了一种方法。

    编写了一个脚本,sc failure servicename reset=86400 actions=restart/5000/restart/5000

    服务安装结束后,运行服务,然后,再运行这行命令,就可以设置服务在挂掉后,5秒后重启了。

    参考链接如下:

    http://stackoverflow.com/questions/22872510/how-to-use-sc-to-install-a-service-and-specify-no-action-for-subsequent-failu

    http://stackoverflow.com/questions/15085856/using-sc-to-install-a-windows-service-and-then-set-recovery-properties

    2016年9月19日 2:08

全部回复

  • 你好 kelivnchgli,

    我下载那个demo, 在console 的项目里没有找到配置文件,请问你在哪里改了配置。改了配置,出现了什么样的错误?有详细的错误信息吗?

    另外,你如果在服务挂掉后,你可以做一个console 项目,轮询window 服务,是否正常运行,如果不是正常运行的话,则重启window服务。

    #检查window 服务状态的代码:

    using System.ServiceProcess;
    
    ServiceController sc = new ServiceController(SERVICENAME);
    
    switch (sc.Status)
    {
        case ServiceControllerStatus.Running:
            return "Running";
        case ServiceControllerStatus.Stopped:
            return "Stopped";
        case ServiceControllerStatus.Paused:
            return "Paused";
        case ServiceControllerStatus.StopPending:
            return "Stopping";
        case ServiceControllerStatus.StartPending:
            return "Starting";
        default:
            return "Status Changing";
    

    #启动服务的代码

    public static void StartService(string serviceName, int timeoutMilliseconds)
    {
      ServiceController service = new ServiceController(serviceName);
      try
      {
        TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);
    
        service.Start();
        service.WaitForStatus(ServiceControllerStatus.Running, timeout);
      }
      catch
      {
        // ...
      }
    }

    Best regards,

    Cole Wu


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2016年9月14日 7:37
    版主
  • 谢谢你的回复。

    我没有修改console项目里的配置文件,只是修改了服务的代码,将对服务的配置添加到服务项目本身代码中,目的是,在创建爱服务的时候,便对服务进行配置,配置服务能够在挂掉后自动重启。之前的方法是,创建一个守护服务,改守护服务的作用是,每隔5分钟检测一次其他服务的状态,若发现某服务挂掉了,重启挂掉的服务。但是,存在这样的风险,由于在每隔5分钟检测一次服务状态,最糟糕的情况下,挂掉的服务会有5分钟处于未工作状态,会丢失很多需要捕获的数据。当然,也可以缩短查询时间,但是由于守护服务的可靠性无法保证,如果它也挂了,那后果很严重。因此,希望通过SCM提供的功能,由系统来监视服务的状态,这样可靠性和性能会更高些。

    现在的问题是,将在服务工程中,对服务的属性进行配置,运行后会出错。

    2016年9月18日 3:51
  • 需要借助于AlwaysUp这样的软件,保证服务挂掉后,再重启。

    http://www.0daydown.com/07/314246.html


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2016年9月18日 6:37
  • 谢谢你的回复。

    但是我们的工具是给用户使用的,而且用户数较多,让用户使用第三方工具来确保我们的服务不挂掉不太合适。请问能够 有可编程的方式。

    开发环境:win7

    运行环境:win10

    应用类型:windows 服务

    描述:希望在服务中编写代码,配置服务在挂掉后,5秒后自动重启。在MSDN示例库中找打了一个示例,链接如下:https://code.msdn.microsoft.com/windowsapps/CSWindowsServiceRecoveryPro-2147e7ac。此示例包含一个ConsoleApp和一个windows服务,单独运行ConsoleApp可以对服务进行配置,配置无法挂掉后重启。但是修改代码,在服务中添加对服务本身的配置,会运行是出错。


    2016年9月18日 6:52
  • 试下这个Framework Toshelf

    https://github.com/Topshelf/Topshelf

    这样的话,守护服务只需要轮循检测这个控制台进程是否存在,不存在则启动它即可。

    控制台进程(服务)启动时要实现单例模式。


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2016年9月18日 7:01
  • 谢谢大家的 回复,找到了一种方法。

    编写了一个脚本,sc failure servicename reset=86400 actions=restart/5000/restart/5000

    服务安装结束后,运行服务,然后,再运行这行命令,就可以设置服务在挂掉后,5秒后重启了。

    参考链接如下:

    http://stackoverflow.com/questions/22872510/how-to-use-sc-to-install-a-service-and-specify-no-action-for-subsequent-failu

    http://stackoverflow.com/questions/15085856/using-sc-to-install-a-windows-service-and-then-set-recovery-properties

    2016年9月19日 2:08