Windows管理者は、サービスを停止または開始しようとすると「 」または「 」の状態services.mscでハングアップしてしまうという、イライラさせられる状況によく遭遇します。ボタンがグレー表示になり、何をしてもWindowsが宙ぶらりんの状態になってしまうのです。通常、これはサービスまたはそのプロセスがデッドロック状態になっているか、実際には起こっていない何かを待機している状態です。その場合、コマンドプロンプトから実行しても「サービスを開始または停止しています。しばらくしてからもう一度お試しください」といったエラーが表示されたり、単に停止したりします。少し奇妙ですが、システムは宙ぶらりんの状態になり、通常の制御方法が機能しません。StoppingStartingnet stop
今では、システム全体を再起動する代わりに(それが唯一の選択肢のように思えることもありますが)、停止したプロセスやサービスを強制的に終了する方法があります。完璧ではありませんが、通常は効果的です。PowerShelltaskkillスクリプトなどのコマンドラインツールや、リソースモニターやプロセスエクスプローラーなどの高度なツールを使用するオプションもあります。ただし、重要なシステムサービスを強制的に終了すると、不安定になったりBSOD(ブルースクリーンエラー)が発生したりする可能性があるため、特に本番サーバーやコアシステムサービスでは注意が必要です。
ハングしたWindowsサービスを修復する方法
Taskkill を使用してスタックしたサービスを強制終了する
おそらくこれが最も簡単な方法です。サービスのプロセスID(PID)を見つけて、手動で強制終了します。まず、管理者権限でコマンドプロンプトを開きます。右クリックして「管理者として実行」を選択します。
- services.mscでサービス名を探します(例: Windows Update の場合はwuauserv)。または、次のコマンドを実行して、どのプロセスが実行中かを確認することもできます。
sc queryex wuauserv
これにより、PID(たとえば 9186)が取得されます。次に、次のコマンドで強制終了します。
taskkill /PID 9186 /F
いくつかの設定では、フィルターを使用するとうまくいくかもしれません:
taskkill /F /FI "SERVICES eq wuauserv"
これにより、プロセスリストがフィルタリングされ、そのサービスの背後にあるプロセスのみが強制終了されます。ただし、システムプロセスが重要な場合は強制終了するとシステムがクラッシュする可能性があるため、何をすべきか十分に理解していない限り、コアサービスを強制終了しないでください。
PowerShell でスタックしたサービスを強制停止する
この方法は、特にスクリプトを好む人にとっては、より簡潔です。PowerShell では、「停止保留中」または「開始保留中」の状態にあるすべてのサービスを一覧表示できます。
Get-CimInstance -ClassName win32_service | Where-Object { $_. State -eq 'StopPending' }
または開始するには:
Get-CimInstance -ClassName win32_service | Where-Object { $_. State -eq 'StartPending' }
これらの停止したサービスに関連付けられているすべてのプロセスを強制終了するには、次のスクリプトを試してください。
$Services = Get-CimInstance -ClassName win32_service -Filter "State='StopPending'" if ($Services) { foreach ($service in $Services) { try { Stop-Process -Id $service. ProcessId -Force -PassThru } catch { Write-Warning "Couldn’t kill process with ID $($service. ProcessId)" } } } else { Write-Output "No services stuck in stop pending." }
注: 古いバージョンの PowerShell ( 1.0 、 2.0 )Get-WmiObjectでは、 の代わりに が必要ですGet-CimInstance。また、プロセスを強制実行する場合は注意が必要です。強制実行が唯一の方法である場合もありますが、動作が不安定になる可能性があります。
リソースモニターで待機チェーンを分析する
プロセスを強制終了しても問題が解決しない場合、またはプロセスが何か(別のプロセスやロックなど)を待機していると思われる場合は、リソースモニターが役立ちます。 で起動します。 「CPU」resmon.exeタブに移動し、ハングしているプロセスを見つけて右クリックし、「待機チェーンの分析」を選択します。
これはプロセスが何を待機しているかを示します。DLLロックや依存プロセスなど、様々なsvchost.exeプロセスが待機している可能性があります。待機中の場合は、待機の原因を分析する必要があるかもしれません。親プロセス、または待機中のプロセスを強制終了する必要があるかもしれませんが、無関係なシステムプロセスを無作為に強制終了するのは避けてください。
プロセスエクスプローラーを使用してより詳細な制御を行う
管理者権限があっても、特定のプロセス(特にSYSTEM権限で実行されているプロセス)が終了しないことがあります。この問題を回避するには、Process Explorerを使用します。(Sysinternalsスイートから)System権限で実行してくださいPSEXEC -s -i ProcExp.exe。そこから、問題のあるプロセスを見つけて右クリックし、「プロパティ」を選択して「サービス」タブに進みます。必要に応じて、ここで一時的にフルコントロール権限を付与することもできます。
その後、Process Explorerからプロセスを終了させるか、サービスを停止してみてください。場合によっては、正常に終了しない不正なプロセスを停止するには、これが唯一の方法となることがあります。権限設定ガイドに従わない限り、権限は一時的なものなので注意してください。また、レジストリ経由でServicesPipeTimeoutを増やすと、特にサービスがビジー状態または大規模である場合に、起動時または停止時にハングアップするのを防ぐのに役立つ場合があります。
まとめ
結局のところ、スタックしたサービスを強制終了させるのは必ずしも良い方法とは言えませんが、ほとんどの場合、これらの方法で再起動せずに問題を解決できます。ただし、重要なサービスを強制終了すると、注意しないとクラッシュやデータ損失を引き起こす可能性があることを覚えておいてください。通常は、根本原因(依存関係の問題やスタックしたプロセスなど)を特定するのが最善ですが、いざというときには、これらの方法が命綱となることもあります。
まとめ
sc queryexおよびコマンドを使用してtaskkill、サービス プロセスを強制的に終了します。- PowerShell スクリプトを使用すると、停止したサービスまたはプロセスを強制終了できます。
- リソース モニターは、待機チェーンと依存関係の分析に役立ちます。
- Process Explorer を使用すると、より高度な制御で頑固な SYSTEM プロセスを強制終了できます。
- 注意してください。重要なサービスが影響を受ける場合、強制終了によってシステムがクラッシュする可能性があります。
最後に
これらのトリックのどれかが、動かなくなったサービスの復旧に役立つことを願っています。スマートな方法ではありませんが、キーボードを手に取って再起動を祈る前に、これが唯一の現実的な選択肢になることもあります。お役に立てれば幸いです。