COBOLジョブが異常終了したら?初心者でもわかる障害対応フロー完全ガイド
生徒
「先生、大変です!動かしていたCOBOLのジョブがエラーで止まってしまいました。どうすればいいですか?」
先生
「落ち着いてください。バッチ処理では異常終了、いわゆるアベンドは誰にでも起こることです。まずは状況を確認しましょう。」
生徒
「何から手を付ければいいのか全くわからなくて。対応の順番を教えてください!」
先生
「障害対応には決まったフローがあります。原因の調査から復旧までのステップを丁寧に解説しますね!」
1. 異常終了とアベンドの言葉の意味を知る
コンピュータがプログラムを動かしている途中で、予期せぬトラブルが発生して途中で止まってしまうことを異常終了と呼びます。専門用語ではアベンド(Abnormal Endの略)と言われることが多いです。
バッチ処理は、夜中などに大量のデータを自動で処理するため、エラーが起きたときに人間がその場で見ていないことがよくあります。そのため、システムには「どこで、なぜ止まったのか」を記録する仕組みが備わっています。まずは「止まった!」と慌てる前に、システムが残してくれたメッセージを確認することが最初の一歩です。
COBOLのプログラムで、意図的にエラーを検知して終了させる場合の非常にシンプルなコード例を見てみましょう。例えば、データが空だったときに処理を中断するようなイメージです。
IDENTIFICATION DIVISION.
PROGRAM-ID. CHECK-ERROR.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 DATA-COUNT PIC 9(05) VALUE 0.
PROCEDURE DIVISION.
IF DATA-COUNT = 0
DISPLAY "エラー:データがありません。処理を中断します。"
STOP RUN RETURNING 1
END-IF.
STOP RUN.
2. 障害対応フローの第一歩は状況把握
ジョブが止まったとき、最初に行うのは影響範囲の確認です。そのジョブが止まったことで、次に動くはずだったジョブが止まっていないか、あるいは明日の朝の業務に支障が出るのかを確認します。これを、システム運用管理の世界では「インパクト調査」と呼んだりします。
次に、ログを確認します。ログとは、コンピュータが記録している「日記」のようなものです。COBOLのバッチ処理であれば、システムメッセージや、プログラムが独自に出力した実行結果(リスト)にヒントが隠されています。特に「Return Code(リターンコード)」と呼ばれる数字に注目してください。これが0以外であれば、何らかの問題が発生した証拠です。
例えば、リターンコードを受け取る制御のイメージは以下のようになります。
IDENTIFICATION DIVISION.
PROGRAM-ID. RETURN-CODE-SAMPLE.
PROCEDURE DIVISION.
* 何らかの処理を実行
DISPLAY "バッチ処理を実行中です..."
* 異常を検知したと想定してコード8を返す
MOVE 8 TO RETURN-CODE.
STOP RUN.
3. エラーメッセージと原因の切り分け
ログには、英語と数字が混ざったエラーコードが書かれていることがあります。これをマニュアルで調べることで、原因を切り分けます。主な原因には以下の3つのパターンがあります。
一つ目はデータの問題です。本来は数字が入るべき場所に文字が入っていたり、計算できない大きな数字が入力されたりする場合です。これをデータ例外と呼びます。二つ目は環境の問題です。読み込むべきファイルが見つからない、あるいはハードディスクの容量がいっぱいになってしまった場合などです。三つ目はプログラムの問題です。プログラム自体の書き方に間違いがあり、特定の条件で動かなくなってしまうパターンです。
原因を特定するために、計算処理でエラーが起きやすい場所を想定したチェックコードを書いてみましょう。ゼロで割り算をしてしまうとシステムは止まってしまうため、事前に防ぐ必要があります。
IDENTIFICATION DIVISION.
PROGRAM-ID. DIVIDE-CHECK.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 NUM-A PIC 9(03) VALUE 100.
01 NUM-B PIC 9(03) VALUE 0.
01 RESULT-VAL PIC 9(03).
PROCEDURE DIVISION.
IF NUM-B = 0
DISPLAY "エラー:ゼロ除算を検知しました。"
ELSE
DIVIDE NUM-A BY NUM-B GIVING RESULT-VAL
END-IF.
STOP RUN.
4. データのバックアップと復旧ポイント
原因がわかったら、次に考えるのはデータの復旧です。バッチ処理は途中で止まると、データが「半分だけ更新された」という非常に中途半端な状態になることがあります。このまま無理に再開すると、二重に計算されてしまったり、情報が壊れたりする恐れがあります。
そこで重要になるのがバックアップです。処理を始める直前の綺麗なデータに戻す作業を、専門用語でリカバリまたはロールバックと言います。運用管理者は、あらかじめ決めておいた復旧ポイント(どの時点の状態に戻すか)を確認し、データを掃除してからやり直す準備を整えます。パソコンを触ったことがない方でも、「失敗する前の状態に時間を巻き戻す」と考えると分かりやすいでしょう。
5. ファイルのクリーニングと再実行の準備
データを戻したら、次はクリーニングです。エラーで中途半端に作られてしまった一時ファイルなどを削除します。これを行わずに再実行すると、「すでにファイルが存在します」という別のエラーで再び止まってしまうことがあるからです。
COBOLの運用管理では、ジョブを実行する前に必ず古いファイルを消すというステップを組み込むことが多いです。障害対応の現場では、手動でこれらのファイルを整理し、プログラムが「まっさらな状態」で再スタートできるように環境を整えます。これをしっかり行うことで、二度手間に陥るのを防ぐことができます。
6. ジョブの再実行(リスタート)の手順
準備が整ったらいよいよリスタートです。リスタートには二つの方法があります。一つは、最初から全てやり直す「先頭リスタート」。もう一つは、止まった場所から再開する「途中リスタート」です。
COBOLプログラムが非常に長く、数時間かかるような処理の場合は、途中から再開できる仕組み(チェックポイントリスタート)を導入していることがあります。しかし、初心者のうちは、データの不整合を防ぐために「最初からやり直す」方が安全で確実です。実行ボタンを押す際は、原因が完全に取り除かれたかをもう一度自分に問いかけてから行います。
7. 暫定対応と恒久対応の違いを理解する
障害対応には、時間の猶予がない場合が多いです。例えば、朝までに処理を終わらせないと開店時間に間に合わない、という時です。この場合、とりあえず問題のデータをスキップして無理やり終わらせることを暫定対応と言います。
しかし、これだけでは根本的な解決にはなりません。後日、なぜその問題が起きたのかをしっかり調査し、二度と同じことが起きないようにプログラムを直したり、データのチェックを厳しくしたりすることを恒久対応と言います。火事であれば、まずは火を消すのが暫定対応、火元を調査して防火対策をするのが恒久対応、というわけです。
8. 障害報告書の作成とノウハウの蓄積
無事にジョブが動いて業務が正常に戻ったら、最後の大事な仕事が報告書の作成です。いつ、どのジョブが、どんなエラーで止まり、誰がどうやって直したのかを記録に残します。これは単なる事務作業ではありません。
次に同じようなエラーが起きたとき、この報告書があれば、誰でも素早く対応できるようになります。これを「ナレッジの共有」と呼びます。COBOLのような長い歴史を持つシステムでは、過去の先輩たちが残した膨大な報告書が、今の安定稼働を支える強力な武器になっています。記録を大切にすることが、優れた運用管理者への近道です。最後に、実行結果を出力して記録に残すイメージのプログラムを確認しましょう。
IDENTIFICATION DIVISION.
PROGRAM-ID. LOG-OUTPUT.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 CURRENT-DATE PIC 9(08).
01 LOG-MESSAGE PIC X(40) VALUE "リカバリ処理が正常に終了しました。".
PROCEDURE DIVISION.
* システムから日付を取得(例として20260328)
ACCEPT CURRENT-DATE FROM DATE.
DISPLAY "記録日: " CURRENT-DATE.
DISPLAY "メッセージ: " LOG-MESSAGE.
STOP RUN.
9. 落ち着いて対応するための心がけ
最後に、技術的なことよりも大切なのが落ち着くことです。ジョブが止まると画面に赤い警告が出たり、アラームが鳴ったりして緊張しますが、焦って操作すると間違ったデータを消してしまうなど、さらに大きな障害を招く「二次災害」の原因になります。
必ず周囲に報告し、複数の人で手順を確認しながら進めることが、プロの現場では求められます。一つひとつのステップを丁寧に進めれば、どんなエラーも必ず解決できます。このフローを頭に入れて、一歩ずつ学んでいきましょう。