PowerShellで特定のサービスが動いているか確認する方法

一つのWindows service状態確認では、画面に値が出たことと目的を満たしたことを分けて考えます。結論は「Get-Service -Nameで対象を一意に取得し、存在しない、Stopped、Pending、Runningを別statusとして扱います。Runningだけでは機能正常を保証しないため、依存関係、event、固有health checkも確認します。」。service内部Nameを固定し、Statusとapplication healthを別に判定する条件のもと、出力の意味、境界値、影響のある操作を順に確認します。

目次

確認対象をservice nameで一意にする

サービス監視では、正確なServiceNameを一件に絞り、Statusと開始種類を別々に確認します。アプリケーションの正常性はサービスがRunningだけでは保証できないため、依存サービス、待受ポート、認証不要のヘルスエンドポイントも読み取り確認します。停止中と取得失敗を別の判定結果として記録します。

  • Get-Service -Nameで正式NameとDisplayNameを確認する
  • Get-CimInstance Win32_ServiceでStartModeとProcessIdを確認する
  • DependentServicesとServicesDependedOnを読む
  • service owner、期待状態、maintenance条件を確認する

Running・Stopped・Pending状態を文字列化する

対象を一意に読む

Get-Service -Name 'wuauserv' -ErrorAction Stop |
  Select-Object Name,DisplayName,Status,StartType

Select-Object後のStatusだけでなく元objectを保持します。

存在しない場合を分ける

$svc=Get-Service -Name 'wuauserv' -ErrorAction SilentlyContinue
if($null -eq $svc){'NotInstalled'} elseif($svc.Status -eq 'Running'){'Running'} else{$svc.Status}

取得errorをStoppedと表示しません。自動監視ではerror streamも記録します。

依存関係を確認

$svc=Get-Service -Name 'bits'
$svc.ServicesDependedOn | Select-Object Name,Status
$svc.DependentServices | Select-Object Name,Status

停止や再起動を検討する前の読み取りです。

CIM情報を補足

Get-CimInstance Win32_Service -Filter "Name='bits'" |
  Select-Object Name,State,StartMode,ProcessId,ExitCode

PathNameやaccountは機密性を考慮して必要時だけ表示します。

短い待機後に再取得

1..3 | ForEach-Object { Get-Date; Get-Service -Name 'bits' | Select-Object Name,Status; Start-Sleep 5 }

pendingを一回だけで断定せず、上限付きで変化を見ます。

NotInstalledを停止中と分ける

StatusはService Control Manager上の状態です。Runningでもprocess内のworkerが停止している場合があり、Stoppedでもmanual/trigger start設計なら正常です。StartType、trigger、maintenance、dependent applicationを合わせて判断します。Pendingが続く時間の閾値はservice固有です。

依存serviceとStartModeを補足する

Services console、Get-Service、Win32_Serviceを同時刻で照合し、application固有endpointやeventも確認します。監視scriptはNotInstalled、AccessDenied、Pending、Running、Stoppedをtestし、期待状態と異なる場合だけalertします。

短い再取得で一時stateを見分ける

  • 取得失敗をStoppedと表示する
  • DisplayNameをNameと混同する
  • Runningを機能正常とする
  • 依存serviceを見ない
  • 監視のたび自動restartする

状態変更commandを監視scriptへ混ぜない

確認だけなら変更しません。Start-Service、Stop-Service、Restart-Serviceは利用者session、update、print job等へ影響するため、一般的な自動修復例にしません。変更前状態、依存、graceful手順、backup、起動順を記録し、異常時は元のStartTypeとStatusへ戻したうえでhealthを確認します。security serviceを停止しません。

ServiceControllerとCIMの結果を検収する

exactなservice NameをGet-Service -ErrorAction Stopで読み、NotInstalled、Stopped、Pending、Runningを分けます。Get-CimInstance Win32_ServiceのStartMode、ProcessId、ExitCodeとapplication healthを足し、SCM状態だけで正常とはしません。

BITSを四状態のobjectとして返す

$name='bits'
try { $s=Get-Service -Name $name -ErrorAction Stop; [pscustomobject]@{State=$s.Status.ToString();Name=$s.Name;StartType=$s.StartType} } catch [Microsoft.PowerShell.Commands.ServiceCommandException] { [pscustomobject]@{State='NotInstalled';Name=$name} }

service四状態を再取得結果で確定する

  • 状態を取得:serviceが一件でRunning等のStatusとStartType/StartModeが取得でき、health endpointも応答する
  • service未導入:ObjectNotFoundはNotInstalledとして明示し、Stoppedや取得errorに置換しない
  • SCM・CIM error:AccessDenied、SCM/RPC error、pending timeoutはErrorRecordと経過秒を保存する

DisplayNameではなくNameを使い、pendingを一回だけ見て停止/稼働と断定しません。確認処理でStart-ServiceやRestart-Serviceを自動実行せず、依存serviceとmaintenance条件を別に評価します。

StartPendingとProcessId 0を試す

$w=Get-CimInstance Win32_Service -Filter "Name='bits'" -ErrorAction Stop
[pscustomobject]@{State=$w.State;StartMode=$w.StartMode;ProcessId=$w.ProcessId;ExitCode=$w.ExitCode}

未導入、Stopped、Running、StartPending/StopPending、Disabled、access deniedをtestします。SCM/CIM/endpointの三結果、取得時刻、pending継続秒を同じrecordへ残します。

瞬間的なStartPendingやStopPendingを即座に異常判定せず、短い上限付き待機後に再取得します。変更は行わず、Name、Status、StartType、依存関係を監視記録へ残します。

公式情報・参考資料

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次