windows 服务没有响应控制函数(错误2186)

shyt4zoc  于 2022-11-18  发布在  Windows
关注(0)|答案(5)|浏览(473)

我正在Windows平台上使用.NET开发一项服务。
昨天还能用......但是今天它不想启动!!!这看起来很奇怪,我觉得我错过了什么......
我还尝试将源代码恢复到上一个工作版本,但没有任何其他结果:* 净启动 * 输出:
服务没有响应控制功能。
什么原因会导致此故障?
也许你们大多数人都想知道更多关于它的信息。所以,让我给你们看一些代码:
服务代码:

#if DEBUG
class iGeckoService : DebuggableService
#else
class iGeckoService : ServiceBase
#endif
{
    static void Main()
    {
#if DEBUG
        if (Debugger.IsAttached == true) {
            DebuggableService[] services = Services;

            // Create console
            AllocConsole();

            // Emulate ServiceBase.Run
            foreach (DebuggableService service in services)
                service.Start(null);

            // Wait for new line
            Console.WriteLine("Press ENTER to exit..."); Console.ReadLine();

            // Emulate ServiceBase.Run
            foreach (DebuggableService service in services)
                service.Stop();
        } else
            ServiceBase.Run(Services);
#else
        ServiceBase.Run(Services);
#endif
    }

#if DEBUG

    static DebuggableService[] Services
    {
        get {
            return (new DebuggableService[] { new iGeckoService() });
        }
    }

    [DllImport("kernel32")]
    static extern bool AllocConsole();

#else

    static DebuggableService[] Services
    {
        get {
            return (new ServiceBase[] { new iGeckoService() });
        }
    }

#endif

    #endregion

    #region Constructors

    /// <summary>
    /// Default constructor.
    /// </summary>
    public iGeckoService()
    {
        // Base properties
        ServiceName = DefaultServiceName;

        // Service feature - Power events
    }

    #endregion

    protected override void OnStart(string[] args)
    {
        try {
            ...

        } catch (Exception e) {
            sLog.Error("Unable to initialize the service. Request to stop.", e);
        }
    }

    /// <summary>
    /// Stop this service.
    /// </summary>
    protected override void OnStop()
            {
                     ...
            }
  }

  [RunInstaller(true)]
public class iGeckoDaemonInstaller : Installer
{
    /// <summary>
    /// Default constructor.
    /// </summary>
    public iGeckoDaemonInstaller()
    {
        ServiceProcessInstaller spi = new ServiceProcessInstaller();
        spi.Account = ServiceAccount.LocalSystem;

        ServiceInstaller si = new ServiceInstaller();
        si.ServiceName = iGeckoService.DefaultServiceName;
        si.StartType = ServiceStartMode.Automatic;

        Installers.AddRange(new Installer[] {spi, si});
    }
}

class DebuggableService : ServiceBase
{
    public void Start(string[] args) { OnStart(args); }
}

启动脚本为:

installutil ..\bin\Debug\iGeckoService.exe
net start "Gecko Videowall"

而停止脚本为:

net stop "Gecko Videowall"
installutil /u ..\bin\Debug\iGeckoService.exe

不过,我认为这是一个系统设置,因为应用程序一直运行良好,直到最后一天。(叹口气)。

  • 更新 *

当服务工作时,我使用log 4 net记录服务活动(我无法将调试器连接到正在运行的服务...),它一直在记录。
从现在起,log 4 net日志将不再创建(即使我启用内部调试选项),即使我在Main例程中进行日志记录!

  • 另一个更新 *

应用程序似乎永远不会执行。我已经减少了每个例程(Main、OnStart、OnStop),并且运行了一个空服务。OnStart例程在一个目录上创建了一个文件(每个人都可以完全写入),但是当服务启动时,没有创建任何文件。

  • 又一次更新 *

受到Rob评论的刺激,我在活动查看器上看到了以下消息:

> Faulting application name: iGeckoService.exe, version: 1.0.0.0, time stamp: 0x4c60de6a
> Faulting module name: ntdll.dll, version: 6.1.7600.16385, time stamp: 0x4a5be02b
> Exception code: 0x80000003
> Fault offset: 0x000000000004f190
> Faulting process id: 0x1258
> Faulting application start time: 0x01cb384a726c7167
> Faulting application path: C:\Users\Luca\Documents\Projects\iGeckoSvn\iGeckoService\bin\Debug\iGeckoService.exe
> Faulting module path: C:\Windows\SYSTEM32\ntdll.dll
> Report Id: b096a237-a43d-11df-afc4-001e8c414537

这就是服务关闭的确切原因...而不是问题变成:“如何调试它?”(谢谢Rob,我从来没有想过事件查看器,直到现在!)调试它运行作为控制台应用程序,它没有显示任何错误,事实上,它似乎与服务环境有关。唯一的事情来我的脑海可能是一些DLL加载失败,因为现在的服务是空的...任何想法?
(感谢大家关注我......我想为大家提供比萨饼和啤酒)
解决了
由于安装和设置MS Application Verifier(x64)导致Main例程之前发生崩溃,因此服务无法启动。卸载该应用程序后,一切正常!
谢谢大家!

vojdkbi0

vojdkbi01#

一般来说,每个服务都必须做以下两件简单事情

  • 如果服务管理器向他发送一个控制代码,如SERVICE_CONTROL_STARTSERVICE_CONTROL_STOP等,如果应该在一个短时间间隔内返回。使用SetServiceStatus函数service可以延长此时间间隔,例如,通过使用递增的dwCheckPoint值调用SetServiceStatus。(在.NET中,可以使用ServiceBase.RequestAdditionalTime代替)
  • 每个服务必须回答SERVICE_CONTROL_INTERROGATE控制代码,并返回。服务管理器使用此控制代码来检测服务是否仍在运行。

如果您的程序不遵循其中一个规则,您会收到错误消息“The service is not responding to the control function”(服务未响应控制函数)。
如果你用.NET写程序,你不需要直接做我之前描述的两件事。ServiceBase类会为你做这两件事。然而,如果你创建了一个优先级比平常高的线程,或者你在OnXXX句柄中做了一些太长的工作,你很容易违反这个规则(OnStopOnStartOnPowerEvent等),而不调用ServiceBase.RequestAdditionalTime。其他一些带有额外线程的技巧也会产生问题。

ax6ht2ek

ax6ht2ek2#

如果你试图在OnStart调用中做太多的工作,通常会发生这种情况。例如,如果你在同一个线程中启动了一个无限循环,你会得到这样的错误信息。
通常,服务应该在OnStart调用中创建一个新线程,然后在OnStop调用中干净地终止它。
当然,如果你使用的是以前工作的代码,这就没有帮助了。自从失败后,你有没有试过重新启动它?我似乎记得,如果你已经有一个被中断的服务,有时候不重新启动它就很难回到工作状态。你可能想看看你的进程列表,看看你是否有一个副本还在运行,如果是的话,就把它关掉。

pgvzfuti

pgvzfuti3#

对我来说,这只是意味着引发了一个异常。(配置管理器中的平台冲突,导致“错误的图像格式”。)尝试从命令行运行.exe,看看是否会出现错误。

lymgl2op

lymgl2op4#

我看到有一个代码块

// Wait for new line
            Console.WriteLine("Press ENTER to exit..."); Console.ReadLine();

正如@Jon所述,因为这是一个服务。当服务启动时,它会等待一个规定的时间,在该时间内它应该做出响应。
有一个语句“Console.ReadLine()“你的服务将等待直到键被按下。因为这是一个服务将保持等待在这一点

vwkv1x7d

vwkv1x7d5#

对我来说,这是一个错误,在文件中配置为windows服务。我发现了一个语法错误,由于我得到了这个错误代码。
修复了语法错误,我能够再次重新启动服务。

相关问题