web-dev-qa-db-ja.com

ServiceControllerがサービスを停止できないようです

ローカルマシンでWindowsサービスを停止しようとしています(サービスはTopshelf.Host、それが重要な場合)このコードで:

serviceController.Stop();
serviceController.WaitForStatus(ServiceControllerStatus.Stopped, timeout);

timeoutは1時間に設定されていますが、実際にサービスが停止することはありません。奇妙なことに、サービス内からMMCスナップインで最初に「停止」状態で表示されますが、しばらくすると「開始済み」に戻ります。ただし、手動で停止すると、エラーが発生します。

Windows could not stop the Topshelf.Host service on Local Computer.
Error 1061: The service cannot accept control messages at this time.

ここに何かが足りませんか?

25
Anton Gogolev

私はこれに答えるのがかなり遅れていることを知っていますが、同様の問題、すなわちエラーに直面しました:"このサービスは現時点で制御メッセージを受け入れることができません。"そしてこれを参照として追加したいその他。

Powershellを使用してこのサービスを強制終了できます(管理者としてpowershellを実行します)。

#Get the PID of the required service with the help of the service name, say, service name.
$ServicePID = (get-wmiobject win32_service | where { $_.name -eq 'service name'}).processID 

#Now with this PID, you can kill the service
taskkill /f /pid $ServicePID
43
Rishi

サービスが大きな操作の処理でビジーであるか、状態を変更するために移行中です。したがって、もはや入力を受け入れることはできません...それを噛むことができる以上のものを取ると考えてください...

大きなものを何も与えていないことが確実な場合は、タスクマネージャーに移動してこのサービスのプロセスを強制終了するか、コンピューターを再起動してください。

13

Topshelfホストサービスでもまったく同じ問題がありました。原因は、20秒以上の長いサービス開始時間でした。これにより、サービスはそれ以上のリクエストを処理できない状態になりました。コマンドラインからサービスを開始したときにのみ問題を再現できました(net start my_service)。

スター時間が長いTopshelfサービスの適切な初期化は次のとおりです。

 namespace Example.My.Service
 {
    using System;
    using System.Threading.Tasks;

    using Topshelf;

    internal class Program
    {
        public static void Main()
        {
            HostFactory.Run(
                x =>
                {
                    x.Service<MyService>(
                        s =>
                        {
                            MyService testServerService = null;
                            s.ConstructUsing(name => testServerService = new MyService());
                            s.WhenStarted(service => service.Start());
                            s.WhenStopped(service => service.Stop());
                            s.AfterStartingService(
                                context =>
                                {
                                    if (testServerService == null)
                                    {
                                        throw new InvalidOperationException("Service not created yet.");
                                    }
                                    testServerService.AfterStart(context);
                                });
                        });
                    x.SetServiceName("my_service");
                });
        }
    }

    public sealed class MyService
    {
        private Task starting;

        public void Start()
        {
            this.starting = Task.Run(() => InitializeService());
        }

        private void InitializeService()
        {
            // TODO: Provide service initialization code.
        }

        [CLSCompliant(false)]
        public void AfterStart(HostControl hostStartedContext)
        {
            if (hostStartedContext == null)
            {
                throw new ArgumentNullException(nameof(hostStartedContext));
            }
            if (this.starting == null)
            {
                throw new InvalidOperationException("Service start was not initiated.");
            }
            while (!this.starting.Wait(TimeSpan.FromSeconds(7)))
            {
                hostStartedContext.RequestAdditionalTime(TimeSpan.FromSeconds(10));
            }
        }

        public void Stop()
        {
            // TODO: Provide service shutdown code.
        }
    }
}
6
blaz

この問題は、特にサービスが保留状態で開始され、成功したが何もしないプログラムで停止を送信したときにも見られました。また、実行中のサービスへの停止コマンドがこの同じ例外で失敗することがありますが、それでも実際にはサービスを停止します。 APIが信頼できるとは思わない。このエラーメッセージの説明は非常に役立ちます...

http://technet.Microsoft.com/en-us/library/cc962384.aspx

1
jtruelove

私は同様の問題に直面しました。このエラーは、サービスが制御メッセージを受け入れることができないために発生することがあります。これは、特定のサービスのログファイルが存在するサーバーのディスク容量の問題が原因である可能性があります。これが発生した場合は、以下のオプションも検討できます。 1.サービスexeのログファイルがある場所に移動します。 2.空き容量を増やします3.タスクマネージャーを介してサービスのプロセスを終了します4.サービスを開始します。

1
user5465995

古いマルチパーティションボックスから新しいシングルパーティションボックスにコードを移動するときに、この問題と戦っただけです。サービス停止時にD:に書き込みを行っていましたが、もう存在していなかったため、1061エラーが発生しました。ただし、コールバックデリゲートを使用して別のスレッドへの呼び出しをスピンオフしない限り、OnStop中の長い操作によってこれが発生します。

0
TWood

私はそれが前に開かれたことを知っていますが、Windowsコマンドプロンプトのオプションが少し欠けているので、完全性のためだけに

  1. タスクマネージャーを開き、それぞれのプロセスとそのPID、つまりPID = 111 を見つけます。
    • 最終的には、エグゼクティブファイル(つまり、イメージ名= notepad.exe)を絞り込むことができます
  2. コマンドプロンプトでコマンドTASKKILL を使用します。
    • 例:TASKKILL/F/PID 111; TASKKILL/F/IM notepad.exe
0
FanaS