【Stop-Process】PowerShellでプロセスを強制終了させる方法とは?

こんにちは。チェシャ男です。(-皿-)

今回は、

【PowerShell でプロセスを強制停止する方法】

についてご紹介します。

応答なし“で固まってしまったウィンドウをプロセスごと強制的に停止させたいときにはStop-Process コマンドレットを使用するとよいでしょう!

また、あなたがスクリプトを書くときに「特定の条件下でプロセスを停止させる」という動作を実装したい場合は、Stop-Process コマンドレットを使用して実現することができます。

プロセスを「強制的に停止する」のではなく「停止するまで待機する」方法についてはこちら↓の記事をご参考ください。

[blogcard url=”https://cheshire-wara.com/powershell/ps-cmdlets/system-service/wait-process/”]

 

Stop-Process でプロセスを停止する

プロセスを停止するコマンドレットに

Stop-Process

というものがあります。

【コマンドレット】

Stop-Process

【オプション】

パターン1(プロセス名から指定)
-Name <プロセス名>
-PassThru
-Force
-WhatIf
-Confirm

パターン2(プロセスIDで指定)
-Id <プロセスID>
-PassThru
-Force
-WhatIf
-Confirm

パターン3(オブジェクトで指定)
-InputObject <プロセスオブジェクト>
-PassThru
-Force
-WhatIf
-Confirm

【入力】

System.Diagnostics.Process

【出力】

System.Diagnostics.Process

【エイリアス】

kill
spps

プロセスとは何か」については「プロセスとは…」をご覧下さい。

プロセス名を指定してプロセスを停止する

特定のプロセス名を指定して実行中のプロセスを停止する方法をご紹介します。

コマンドレット詳細に記載した「パターン1(プロセス名で指定)」のオプションを指定します。

Stop-Process -Name “プロセス名

プロセス名を確認したい場合は Get-Process コマンドレットを使用します。

[blogcard url=”https://cheshire-wara.com/powershell/ps-cmdlets/system-service/get-process/”]

今回は例として「メモ帳」を停止してみます。メモ帳のプロセス名は「notepad」ですので “-Name” に notepad を指定します。

まずはメモ帳が起動しているか確認してみましょう。

PS C:\work> Get-Process -Name notepad

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id  SI ProcessName
-------  ------    -----      ----- -----   ------     --  -- -----------
    141       7     4148      11136    73     0.12   5028   1 notepad
    143       7     4152      11112    73     0.06   6076   1 notepad

上の確認結果を見てもらうとわかる通りメモ帳を2重起動している状態です。

実際にプロセスを停止してみます。

PS C:\work> #「notepad」プロセスを停止する
PS C:\work> Stop-Process -Name notepad
PS C:\work>
PS C:\work> #プロセスを再度確認してみる
PS C:\work> Get-Process -Name notepad
Get-Process : 名前 "notepad" のプロセスが見つかりません。プロセス名を確認し、コマンドレットを再度呼び出してください。
発生場所 行:1 文字:1
+ Get-Process -Name notepad
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (notepad:String) [Get-Process], ProcessCommandException
+ FullyQualifiedErrorId : NoProcessFoundForGivenName,Microsoft.PowerShell.Commands.GetProcessCommand

この通りプロセスが停止されて存在していないことがわかりますね。

「プロセス名を指定してプロセスを停止する」場合の特徴は同じプロセス名を持ったプロセスが全て停止されるという点です。

特定のプロセスだけ停止したい場合は次のプロセスIDを指定する方法を使用しましょう。

プロセスIDを指定してプロセスを停止する

次に特定のプロセスIDを指定して実行中のプロセスを停止する方法をご紹介します。

コマンドレット詳細に記載した「パターン2(プロセス ID で指定)」のオプションを指定します。

Stop-Process -ID “プロセスID

プロセス ID を確認したい場合も同様に Get-Process コマンドレットを使用します。

プロセス ID は実行中の全てのプロセスに一意に設定されるため「必ず1つのプロセスを指定できる」という特徴があります。

つまり、同じ「メモ帳」のプロセスでもプロセス ID は異なります。

メモ帳のプロセスを確認してみましょう。

PS C:\work> # メモ帳のプロセスを確認
PS C:\work> Get-Process -Name notepad

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id  SI ProcessName
-------  ------    -----      ----- -----   ------     --  -- -----------
    141       7     4128      11052    73     0.09   3728   1 notepad
    143       7     4128      11124    73     0.09   4128   1 notepad

結果を見てみるとプロセスIDは「3728」「4128」で全く違う値になっています。

では、「3728」のプロセスIDを指定してメモ帳のプロセスを停止してみましょう。

PS C:\work> #ID指定でプロセスを停止する
PS C:\work> Stop-Process -Id 3728
PS C:\work>
PS C:\work> #再度プロセスを確認する
PS C:\work> Get-Process -Name notepad

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id  SI ProcessName
-------  ------    -----      ----- -----   ------     --  -- -----------
    134       6     3884      11096    72     0.09   4128   1 notepad


PS C:\work> #停止した「3728」のプロセスを確認
PS C:\work> Get-Process -Id 3728
Get-Process : プロセス識別子 3728 のプロセスが見つかりません。
発生場所 行:1 文字:1
+ Get-Process -Id 3728
+ ~~~~~~~~~~~~~~~~~~~~
 + CategoryInfo : ObjectNotFound: (3728:Int32) [Get-Process], ProcessCommandException
 + FullyQualifiedErrorId : NoProcessFoundForGivenId,Microsoft.PowerShell.Commands.GetProcessCommand

このように指定したプロセス ID のプロセスのみ停止することができます。

特定のプロセスのみ停止する場合は “-Id” オプションを使用してプロセス停止を行った方が良いかと思います。

InputObject オプションでプロセスを停止する

3つ目の方法として “-InputObject” オプションを使用するプロセス停止方法があります。

InputObject として指定するオブジェクトは「System.Diagnostics.Process」型である必要があります。

簡単に言うとプロセス専用型のオブジェクトです。

Stop-Process -InputObject “プロセスオブジェクト

プロセス型のオブジェクトというと難しそうに感じますが、Get-Process コマンドレットの実行結果として得られる情報がプロセスオブジェクトそのものなんです。

メモ帳を起動した状態で実行中のプロセスからメモ帳を指定して取得し変数に格納します。

PS C:\work> #Procにプロセスの情報を格納
PS C:\work> $Proc = (Get-Process -Name notepad)
PS C:\work>
PS C:\work> $Proc

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id  SI ProcessName
-------  ------    -----      ----- -----   ------     --  -- -----------
    137       6     3980      11220    72     0.05   2560   1 notepad

PS C:\work> #型を確認
PS C:\work> $Proc.GetType().FullName
System.Diagnostics.Process

この変数$Proc はプロセスのデータが入ったプロセス型のオブジェクトであるといえます。

GetType による型の確認でも「System.Diagnostics.Process」であることがわかりますね。

InputObject オプションに変数$Procを指定することでプロセスを停止することができます。

PS C:\work> #プロセスを停止する
PS C:\work> Stop-Process -InputObject $Proc
PS C:\work>
PS C:\work> #変数に格納したデータを確認
PS C:\work> $Proc

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id  SI ProcessName
-------  ------    -----      ----- -----   ------     --  -- -----------
    137       6     3900      11248    72            2560   1 notepad


PS C:\work>
PS C:\work> #上記プロセスが停止しているのでエラーになる
PS C:\work> Get-Process -Id 2560
Get-Process : プロセス識別子 2560 のプロセスが見つかりません。
発生場所 行:1 文字:1
+ Get-Process -Id 2560
+ ~~~~~~~~~~~~~~~~~~~~
 + CategoryInfo : ObjectNotFound: (2560:Int32) [Get-Process], ProcessCommandException
 + FullyQualifiedErrorId : NoProcessFoundForGivenId,Microsoft.PowerShell.Commands.GetProcessCommand

このようにプロセス型のオブジェクトを入力にして停止することができます。

これをちょっと応用すると、Start-Process コマンドレットでプロセス起動時に、”-PassThru” オプションを使用してプロセスオブジェクトを取得し、Stop-Process の “InputObject” オプションで使用して停止するなんてこともできます。

Start-Process についてはこちら↓の記事をご参考ください。

[blogcard url=”https://cheshire-wara.com/powershell/ps-cmdlets/system-service/start-process/”]

共通のスイッチオプション

Stop-Process コマンドレットには3つのパターンには共通したスイッチオプションが存在します。

「-PassThru」オプション⇒出力を強制

-PassThru” を使用すると停止したプロセスの情報を「System.Diagnostics.Process」型のオブジェクトとして出力するようになります。

PS C:\work> #実行結果を出力させる
PS C:\work> Stop-Process -Name notepad -PassThru

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id  SI ProcessName
-------  ------    -----      ----- -----   ------     --  -- -----------
    143       7     4268      11288    73     0.05   4200   1 notepad

何もつけなかった場合は基本的に出力はありません。

「-Force」オプション⇒強制停止

-Force” を使用すると強制的にプロセスを停止します。

例えば他ユーザが実行するプロセスを停止しようとした場合は、

PS C:\work> Get-Process -IncludeUserName -Name notepad

Handles      WS(K) VM(M)   CPU(s)     Id UserName          ProcessName
-------      ----- -----   ------     -- --------          -----------
    145      11208    73     0.03   5888 CHESHIRE-PC\Hoge  notepad

PS C:\work> Stop-Process -Id 5888

確認
次の項目に対して Stop-Process 操作を実行しますか: notepad(5888)?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): Y

このように「コマンドレットを実行して良いかの確認」が行われます。

しかし “-Force” オプションを使用すれば確認なく停止することができます。

PS C:\work> Get-Process -IncludeUserName -Name notepad

Handles      WS(K) VM(M)   CPU(s)     Id UserName          ProcessName
-------      ----- -----   ------     -- --------          -----------
    148      11180    73     0.08   5136 CHESHIRE-PC\Hoge  notepad

PS C:\work> #強制停止
PS C:\work> Stop-Process -Id 5136 -Force

強制停止をお勧めできませんが自動化するときなどは必要ですね。

「-WhatIf」オプション⇒お試し実行

-WhatIf” を使用すると「何を実行しようとしているか」という結果の予想を見ることができます。

プロセス停止の前にチェックを行う場合などは有効ですね。

PS C:\work> Get-Process -Name notepad

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id  SI ProcessName
-------  ------    -----      ----- -----   ------     --  -- -----------
    143       7     4284      11372    73     0.05   5208   1 notepad

PS C:\work> #お試し実行
PS C:\work> Stop-Process -Id 5208 -WhatIf
WhatIf: 対象 "notepad (5208)" に対して操作 "Stop-Process" を実行しています。

プロセス停止は慎重に行った方が良いので “-WhatIf” で確認する癖をつけると良いかもしれませんね。

「-Confirm」オプション⇒実行の確認

-Confirm” を使用すると「実行するかどうか」の確認が表示されます。

PS C:\work> #確認後に停止する
PS C:\work> Stop-Process -Id 9472 -Confirm

確認
この操作を実行しますか?
対象 "notepad (9472)" に対して操作 "Stop-Process" を実行しています。
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"):Y

私物のパソコンならあまり気にすることはないかもしれませんが、サーバなどを操作している場合は確認する習慣をつけた方がいいかもしれませんね。

まとめ

実行中のプロセスを停止する場合は

Stop-Process <停止対象>

を使用する。

停止するプロセスの対象を指定方法は、

[プロセス名で指定] Get-Process -Name <プロセス名>

[プロセスIDで指定] Get-Process -Id <プロセスID>

[オブジェクトで指定] Get-Process -InputPbject <プロセスオブジェクト>

1 COMMENT

コメントを残す

メールアドレスが公開されることはありません。