こんにちは。チェシャ男です。(-皿-)
今回は、
【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 <プロセスオブジェクト>
[…] / Start-Process 【Stop-Process】PowerShellでプロセスを強制終了させる方法とは? / […]