外部からアプリケーションを終了させる方法

解決


Haru  2005-04-14 22:49:14  No: 120941

いつもお世話になっております。Haruです。

現在VB6.0/WinXPで開発を行っています。

今、外部からアプリケーションの監視を目的とした
プログラムを作成中です。

アプリケーションの起動

プロセスの監視

等はうまくいったのですが、
強制終了させる方法が分かりません。
OpenがあるのだからCloseもあると思うのですが、
ご存知の方がおられましたら、
教えてください。
お願いします。


haru  2005-04-14 23:46:14  No: 120942

説明がなっていないような気がしますので
補足します。

' 実行ファイルを起動する
ProcessId = Shell(ExeName, vbNormalFocus)
' プロセスのハンドルを取得する
ProcessHd = OpenProcess(PROCESS_QUERY_INFORMATION, False, ProcessId)

という風にプロセスの起動を行っています。

この起動したExeが処理中にフリーズしたりした場合に
再起動を行いたいのです。
フリーズしているかどうかの判定は
Logを使って行っています。(Logをはいている時刻など)
あとは、このExeを殺すことさえ出来れば
よいのですが、こちらの過去ログでも
WebやWin32などの本を調べても出てきません。
非常に困っているのですが
何か方法はありませんか?


ちょっと休憩  2005-04-15 02:59:08  No: 120943

Win32APIのWaitForSingleObjectを調べてみて下さい。


haru  2005-04-16 03:45:58  No: 120944

ちょっと休憩さんスレありがとうございます。

調べましたが、説明文を読む限り、
EXEを外部から殺すのとはまた違うようです。
待機状態になるだけで、死んではくれないみたいなのですね。
シグナル状態から、非シグナル状態になるとのことなので
ある意味そうなのかもしれませんが、
私にはWaitForObjectでは出来ないように思います。
完全に殺してしまわないといけないので、
ほかに何か方法がありましたら、
教えてください。


ガッ  2005-04-16 04:01:27  No: 120945

ググ…っても、あんまりいいのが出てこなかった(orz
まぁ、TerminateProcess()などを調べてみると嬉しいかもw;

※危ないので推奨しません(Σ
  他には…CreateRemoteThread()でプロセスにもぐりこんで(できるのか…?)


haru  2005-04-16 06:37:54  No: 120946

すみません。レスを追加するのが遅れました。
こちらにレスした後でしたが、
TerminateProcess()
は調べました。

ガッさんの書かれているとおり、
危険ですよね。
デーモンが残ってしまうとか・・・。
私が作っているものはサーバにのせるので
あまり、リブートも出来ないですし。

何かよい回避方法ご存知ですか?
私が調べる限り、
TerminateProcess()
を使った場合、何回かに1度リブートするとか、
しなければ、危険ということまでは分かりました。

いっそのこと、毎回リブートできれば一番早いのですが、
サーバですからそうもいきません。(開発しているもの的にも人命にかかわるので)

ご存知でしたら、よろしくお願いします。


ふらっと  2005-04-16 07:24:32  No: 120947

先ず、常時実行されているアプリケーションがフリーズしないようにする
ことが一番でしょう。
それでもフリーズしてしまったらTerminateProcessで強制終了させて
警告メッセージを表示しておき、都合の良いところで再起動してもらう
という運用で逃げるしかないでしょうね。

何故フリーズしたのかが後で追跡できる仕組みも作っておいたほうが
いいですね。


haru  2005-04-19 04:56:45  No: 120948

調べた結果を上司に話し、
この処理はなくなりました。

しかし、非常に勉強になり助かりました。
レス下さった皆様、大変ありがとうございます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加