WSHとは?
ProcessIDを取得する
Windowsでのプロセスの無応答に対応するための方式を検討してみた。
最もお手軽は以下の方法かな?
- 前提条件
- 実行するWSHは1プロセスのみ。
- cscriptを使用して起動する。
- 方式
- スクリプトの中で自分のプロセスIDを取得し、ファイルを生成する。ファイル名をプロセスIDにする。
- スクリプトが終了した際に、ファイルを削除する。
- 監視スクリプトを作成し、ファイルが存在した場合、該当するPIDでファイルがcscript.exeが存在するかチェックする。
- PIDが存在した場合は、何らかの要因で無応答になっているものとし、削除を行う。
- 自分をcscript.exeで呼び出すと自分を止めちゃうので、要検討。wscript.exeかな。
ソースコード(vbscript)
■プロセスIDを取得する
Dim objService Set objService = GetObject("winmgmts:") Dim Processes Set Processes = objService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'cscript.exe'") Dim proc For Each proc in Processes WScript.Echo proc.ProcessId ''WScript.Echo proc.Name & vbTab & proc.ProcessId Next
■プロセスPIDの存在チェック
上記、SELECT * FROM Win32_Processes WHERE Name = 'cscript.exe'で、Name = 'xxx'の箇所を
SELECT * FROM Win32_Processes WHERE ProcessId = '<PID>'
にすればよい。
■プロセスを停止する。
Win32_Process ClassのTerminated Methodが使えそうです。
無応答のプロセスをこれでkill出来るのかはよくわかりませんが。。。調査中。
→Sleepプロセスの停止に成功!(WScript.Sleep(t)でスリープさせた実行中のcscript.exeプロセスを停止させることが出来ました)(2009/05/27)
For Each proc in Processes If proc.Name = "cscript.exe" THen proc.Terminate() End If Next
- Win32_Processesに関しては、Win32_Process Classを参照して下さい。