質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

Q&A

解決済

2回答

14092閲覧

【bat】taskkill で親プロセスを終了させる方法

sute

総合スコア25

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

0グッド

2クリップ

投稿2016/02/16 05:46

.bat ファイルを書いていてふと気になったこと。

taskkill /pid 2268 /t /f

と書くことで、指定したプロセスIDを親とするすべてのプロセスを強制終了することが出来ますよね。

成功: PID 2268 のプロセス (PID 2532 の子プロセス) を終了しました。

逆に、PID 2268を子として持つプロセスPID 2532を .bat ファイルから終了させたい場合、どうすればよいのでしょうか?
実際に終了させたいのはコマンド プロンプト画面です。

ちなみにこのPID 2268は、jps -lで取得した一覧から、指定した .jar ファイルを実行しているプロセスのIDを使用しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

子プロセスをtaskkillした時に表示されるメッセージから親のプロセスIDを抜き出してtaskkillすることにしました。

set childPID=子プロセスのID set res=taskkill /pid !childPID! /t /f for /f "delims=" %%a in ('!res!') do ( set pid=%%a ) set pid2=!pid:~0,-17! set pid3=!pid2:~-4! call :TRIM !pid3! taskkill /pid !pid4! /t /f timeout -t 5 goto ACTIVATE :TRIM set pid4=%* exit /b 0 :ACTIVATE その後の処理

かなり強引な方法なので、別の方法が見つかり次第改良したほうが良さそうです。

投稿2016/02/17 02:34

sute

総合スコア25

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kagi_shippo

2016/02/17 04:30 編集

Chromeの子プロセスを指定して試したところ、一見うまく動いている気がしていたのですがだめでしたか。テキトー書いてしまってすみません。
sute

2016/02/17 09:16

原因が判明しました。サクラエディタ等に出力したところ、PARENT_IDの後ろにCR改行が入っており、そのせいで正しくPIDの認識ができていなかったようです。 下記のスクリプトで正しく動作したことをご報告させていただきます。 ``` setlocal enabledelayedexpansion set main=JAVAプロセスのフルネーム set JPS_EXE=jps.exe for /f "tokens=1,2,*" %%i in ('"%JPS_EXE%" -l') do ( if %%j==%main% ( set childPID=%%i for /f "usebackq tokens=2 delims==" %%a in (`wmic process where ^(processid^=!childPID!^) get parentprocessid /value`) do ( set parentPID_temp=%%a set parentPID=!parentPID_temp:~0,-1! ) taskkill /pid !childPID! /t /f taskkill /pid !parentPID! /t /f ) ) ```
guest

0

@echo off

set PID=子プロセスのPID

for /f "usebackq tokens=2 delims==" %%a in (wmic process where ^(processid^=%PID%^) get parentprocessid /value) do (set PARENT_PID=%%a)
taskkill /pid %PARENT_PID% /t /f

でどうでしょう

投稿2016/02/16 12:34

kagi_shippo

総合スコア105

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sute

2016/02/17 02:31

ご回答ありがとうございます。 in() の中をバッククォートで囲って実行しましたが、 ・`taskkill`直前でPARENT_IDを`echo`すると正しく表示される ・しかし`taskkill`ではなぜか該当するプロセスを発見できない という意味不明な状況に陥ってしまいました。 ちなみに`taskkill`直前で`tasklist`を使って検索をすると、PARENT_IDに該当するプロセスは存在していました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問