- PR -

異常終了の判断方法

投稿者投稿内容
ゆうじゅん
ぬし
会議室デビュー日: 2004/01/16
投稿数: 347
投稿日時: 2007-04-05 13:32
特定のプロセスの生き死になら以下のバッチをWindowsタスクで定期的に動かせば
監視できますよ。
コード:
@tasklist | find /c "%1"

@IF ERRORLEVEL 1 GOTO ERR
@GOTO END

:ERR
	@REM エラー処理を入れる
:END



ただ、要件としてはDBが正常に更新できる状態が維持されているかが重要だと思いますので、わたしもunibon氏の言っているようにDBの更新状態をチェックするほうがいいと思います。(できれば別マシンからチェックするのが望ましい)
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2007-04-05 13:49
異常終了を検知したいのは、

1. クライアントアプリ
2. クライアントの進捗チェック(おそらく常駐、非表示でクライアントアプリとは別プロセス?)
3. APサーバ
4. DBサーバ

のどれでしょう?どれを指しているのか明示されていないように読み取りました。
文脈からすると2番っぽいですが、あってますか?

引用:

>起動ログと終了ログ、必要に応じてその間の操作ログをファイルなどに
>出力するようにしておければ、そのファイルを確認すれば、
>異常終了したかどうかは判定できると思います。

上記方法は,プロセス強制終了などのケースを想定すると
ログに書くこと自体が困難という認識です。



はい、書くことは困難でしょう。だから、書かれていなかったら
異常終了していると判断するという意図です。


でも、ゆうじゅうさんの方法のほうが、本体の改造不要で
よさそうかなと思いました。
jojo
会議室デビュー日: 2007/03/19
投稿数: 16
投稿日時: 2007-04-05 17:09
Jittaさん、Unibonさん、未記入さん、ゆうじゅん、よねKENさん

ご回答ありがとうございます。

> サービスで作って、異常終了してもサービスは再起動し、処理を継続あるいはステータスを変更出来るようにする。
> その他、WIN32APIを調べるよろし。
> シャットダウン前にくるメッセージとか、それをキャンセルする方法とか、あると思う。

深く調べるとそのあたりまで行き着きそうですね。
行き着くか、、というのが問題ですが。。(汗)


>ただ、今回は、プロセスの異常終了を検出するよりは、DB をポーリングしても
>いつになってもステータスが変化しない、というイベントを捉えたほうが良いような気がします。
>(タイムアウトという概念を自分で実装することになります。)

タイムアウトの考え方は私も考えたことがあります。
処理ごとにタイムアウトの設定は、今回のケースでは現実的に
難しいと考えています。

・処理ごとタイムアウトを決める必要があること
・今回想定している処理は、外部とのI/Fの部分があり、応答時間が
 全く読めない処理もあること

などがその理由です。


> 実際に処理をおこなうプロセスは進捗テーブルへの挿入と更新はおこなうが、
>正常終了するまでコミットしない。進捗をモニタするプロセスは進捗テーブルをダーティリードする。
>
> 実際に処理をおこなうプロセスが異常終了した場合、つまりコミットせずに
>プロセスが終了した場合はトランザクションがロールバックされるため、
>進捗テーブルへレコードが挿入されていない状態に戻る。進捗をモニタする
>プロセスは進捗テーブルから対象レコードが取得できなかったら、処理プロセスが異常終了したと判断する。

実はこの方法は、既に試して、サンプルを作って提案してみたことがあります。
実際に意図通りに動作しましたが、長時間にわたってトランザクションをかけた状態で
DBに繋ぎっぱなしにするのはどうか、という意見があり、
より良い方法(シンプルな方法)を模索しているところです。


> 異常終了を検知したいのは、
>
>
> 1. クライアントアプリ
> 2. クライアントの進捗チェック(おそらく常駐、非表示でクライアントアプリとは別プロセス?)
> 3. APサーバ
> 4. DBサーバ
>
> のどれでしょう?どれを指しているのか明示されていないように読み取りました。
> 文脈からすると2番っぽいですが、あってますか?

ご認識のとおり、今回は2番を想定しています。
「常駐、非表示でクライアントアプリとは別プロセス」もその通りです。


>はい、書くことは困難でしょう。だから、書かれていなかったら
>異常終了していると判断するという意図です。

なるほど、了解しました。
書かれていなかったら、処理中かもしれないという判断が
入ってしまうのが難しいところだと思います。


>特定のプロセスの生き死になら以下のバッチをWindowsタスクで定期的に動かせば
>監視できますよ

なるほど、こういった方法もあるのですね。
ゆうじゅんさんの発想で調べてみたら、以下のような手法が使えそうな
気がしてきました。

DB側の長時間の処理は、別プロセスで実行されるという前提で

1.DB側で実行される長時間処理は別プロセスで実行される。その際、プロセスIDとプロセス開始時間をDBサーバにセット。

2.チェック側のプログラムは、現在進行中であれば、そのプロセスが存在するかチェックする。
 その際、プロセスIDとプロセス開始時間をキーとして検索を実行する。
 プロセスが存在しなければ、異常終了扱いとする。


現在のプロセスを取得

http://jeanne.wankuma.com/tips/process/getcurrentprocess.htmlを参考に
コード:

' 現在のプロセスを取得する
Dim hProcess As System.Diagnostics.Process = System.Diagnostics.Process.GetCurrentProcess()

' プロセス名を表示する
Console.WriteLine("hProcess.ProcessName=" & hProcess.ProcessName)
Console.WriteLine("hProcess.Id" & hProcess.Id)
Console.WriteLine("hProcess.StartTime" & hProcess.StartTime.ToString)





プロセスの一覧を取得

http://dobon.net/vb/dotnet/process/getprocesses.htmlを参考に
コード:


Dim p As System.Diagnostics.Process

For Each p In ps

Try
'プロセス名を出力する
Console.WriteLine(p.ProcessName & " " & p.Id.ToString & " " & p.StartTime.ToString
Catch
End Try
Next p






[ メッセージ編集済み 編集者: jojo 編集日時 2007-04-05 17:12 ]

スキルアップ/キャリアアップ(JOB@IT)