いつもお世話になっております。Haruです。
現在VB6.0/WinXPで開発を行っています。
今、外部からアプリケーションの監視を目的とした
プログラムを作成中です。
アプリケーションの起動
プロセスの監視
等はうまくいったのですが、
強制終了させる方法が分かりません。
OpenがあるのだからCloseもあると思うのですが、
ご存知の方がおられましたら、
教えてください。
お願いします。
説明がなっていないような気がしますので
補足します。
' 実行ファイルを起動する
ProcessId = Shell(ExeName, vbNormalFocus)
' プロセスのハンドルを取得する
ProcessHd = OpenProcess(PROCESS_QUERY_INFORMATION, False, ProcessId)
という風にプロセスの起動を行っています。
この起動したExeが処理中にフリーズしたりした場合に
再起動を行いたいのです。
フリーズしているかどうかの判定は
Logを使って行っています。(Logをはいている時刻など)
あとは、このExeを殺すことさえ出来れば
よいのですが、こちらの過去ログでも
WebやWin32などの本を調べても出てきません。
非常に困っているのですが
何か方法はありませんか?
Win32APIのWaitForSingleObjectを調べてみて下さい。
ちょっと休憩さんスレありがとうございます。
調べましたが、説明文を読む限り、
EXEを外部から殺すのとはまた違うようです。
待機状態になるだけで、死んではくれないみたいなのですね。
シグナル状態から、非シグナル状態になるとのことなので
ある意味そうなのかもしれませんが、
私にはWaitForObjectでは出来ないように思います。
完全に殺してしまわないといけないので、
ほかに何か方法がありましたら、
教えてください。
ググ…っても、あんまりいいのが出てこなかった(orz
まぁ、TerminateProcess()などを調べてみると嬉しいかもw;
※危ないので推奨しません(Σ
他には…CreateRemoteThread()でプロセスにもぐりこんで(できるのか…?)
すみません。レスを追加するのが遅れました。
こちらにレスした後でしたが、
TerminateProcess()
は調べました。
ガッさんの書かれているとおり、
危険ですよね。
デーモンが残ってしまうとか・・・。
私が作っているものはサーバにのせるので
あまり、リブートも出来ないですし。
何かよい回避方法ご存知ですか?
私が調べる限り、
TerminateProcess()
を使った場合、何回かに1度リブートするとか、
しなければ、危険ということまでは分かりました。
いっそのこと、毎回リブートできれば一番早いのですが、
サーバですからそうもいきません。(開発しているもの的にも人命にかかわるので)
ご存知でしたら、よろしくお願いします。
先ず、常時実行されているアプリケーションがフリーズしないようにする
ことが一番でしょう。
それでもフリーズしてしまったらTerminateProcessで強制終了させて
警告メッセージを表示しておき、都合の良いところで再起動してもらう
という運用で逃げるしかないでしょうね。
何故フリーズしたのかが後で追跡できる仕組みも作っておいたほうが
いいですね。
調べた結果を上司に話し、
この処理はなくなりました。
しかし、非常に勉強になり助かりました。
レス下さった皆様、大変ありがとうございます。
ツイート | ![]() |