PowerShellでジョブを停止する方法:Stop-Jobコマンドレットの使い方を徹底解説

PowerShellでは、バックグラウンドで複数のタスク(ジョブ)を実行することができますが、思ったより時間がかかる処理や不要になったジョブは停止したくなることもあるでしょう。
そんなときに役立つのが Stop-Job コマンドレットです。

このブログ記事では、Stop-Jobの基本的な使い方から、実際の使用例、注意点、そして他の関連コマンドとの組み合わせについても解説します。PowerShellのジョブ管理をより効率的に行うために、ぜひ最後まで読んでみてください。


Stop-Jobとは何か?

Stop-Jobは、PowerShellで実行中または保留中のバックグラウンドジョブを停止するためのコマンドレットです。
ジョブは、Start-Jobで作成された非同期タスクで、Stop-Jobを使うことで、途中で中断することが可能になります。

特に長時間かかる処理や誤って開始してしまったジョブなど、途中で処理を中止したい場面で非常に役立ちます。
停止されたジョブは再開できないため、使い方には注意が必要です。


基本構文と使用方法

Stop-Jobの基本構文は以下の通りです:

Stop-Job -Id <ジョブID>

または、

Stop-Job -Name <ジョブ名>

例1:ジョブIDで停止

Stop-Job -Id 3

このコマンドは、IDが3のジョブを停止します。

例2:ジョブ名で停止

Stop-Job -Name "MyJob"

事前にジョブ名を付けておけば、わかりやすく管理できます。

例3:複数のジョブを一括で停止

Get-Job | Stop-Job

すべてのジョブを一括で停止したいときに便利です。


Stop-Jobを使う前に知っておきたいジョブの状態確認

Stop-Jobを使う前に、どのジョブが動いているか、停止可能な状態かを確認するのが基本です。
そのためには、Get-Jobコマンドレットを使います。

Get-Job

実行中、完了、失敗などのジョブステータスが確認できます。Runningステータスのジョブが停止対象になります。

また、Where-Objectと組み合わせて特定の状態のみを取得することも可能です。

Get-Job | Where-Object {$_.State -eq 'Running'}

実践例:時間のかかるジョブを停止する

次のスクリプトでは、10秒待機するジョブを起動し、その途中で停止します。

# ジョブの起動
$job = Start-Job -Name "TestJob" -ScriptBlock { Start-Sleep -Seconds 10 }

# 少し待ってからジョブの状態を確認
Start-Sleep -Seconds 2
Get-Job

# ジョブの停止
Stop-Job -Name "TestJob"

# 状態を再確認
Get-Job

このように、Start-Jobで開始した処理を、任意のタイミングで止めることができます。


Stop-Job使用時の注意点

Stop-Jobを使用する上での注意点は以下の通りです。

  1. 停止できるのは「実行中」または「保留中」のジョブのみ
     すでに完了しているジョブには効果がありません。
  2. 停止してもプロセスが完全に終了するとは限らない
     特に外部プログラムを呼び出している場合、プロセスが残る可能性があります。
  3. 停止したジョブの出力は取得できないことがある
     Receive-Jobを行う前にStop-Jobを実行すると、出力が失われることがあります。
  4. ジョブは「破棄」ではない
     停止後もRemove-Jobを実行するまでジョブ情報は保持されます。必要に応じて削除しましょう。

ジョブを確実にクリーンアップする方法

ジョブを停止した後は、Remove-Jobでメモリやリソースを解放することをおすすめします。

Get-Job | Remove-Job

これで、不要なジョブ情報をすっきり消去できます。


Stop-Jobと他のジョブ管理コマンドとの連携

PowerShellには、ジョブ管理に関連する以下のようなコマンドがあります。

コマンド機能
Start-Jobジョブの開始
Get-Jobジョブ一覧の取得
Receive-Jobジョブの出力を取得
Stop-Jobジョブの停止
Remove-Jobジョブの削除

たとえば、以下のようなスクリプトで一連のジョブ管理ができます:

# ジョブの起動
$job = Start-Job -ScriptBlock { Get-Process }

# 実行中のジョブ確認
Get-Job

# 結果の取得
Receive-Job -Id $job.Id

# ジョブの停止(実行中なら)
Stop-Job -Id $job.Id

# ジョブの削除
Remove-Job -Id $job.Id

これらを組み合わせて、自動化スクリプトの信頼性や安定性を高めることができます。


まとめ

Stop-Jobは、PowerShellでバックグラウンド処理を管理する上で重要なコマンドレットです。
ジョブが不要になったとき、適切に停止することで、無駄なリソースの消費を防ぐことができます。

特に長時間かかる処理やループ処理の中で使われるジョブに対しては、Get-Jobと組み合わせた丁寧な管理が求められます。

また、ジョブを停止したあとはRemove-Jobでのクリーンアップも忘れずに行うと、より安全にスクリプトを運用できます。

タイトルとURLをコピーしました