エラー通知

エラー通知オブジェクト・クラスは、 エラーがシステム・エラー・ログに記録された場合の条件と行うべきアクションを指定します。 ユーザーは、これらの条件とアクションをエラー通知オブジェクトに指定します。

エラーが記録されるたびに、エラー通知デーモンは、 エラー・ログ・エントリーがいずれかのエラー通知オブジェクトの選択基準に一致しているかどうかを判別します。 一致している場合、デーモンは一致しているオブジェクトごとに、 通知メソッドとも呼ばれるプログラム済みのアクションを実行します。

エラー通知オブジェクト・クラスは /etc/objrepos/errnotify ファイルに置かれます。 エラー通知オブジェクトは、 オブジェクト・データ・マネージャー (ODM) コマンドを使用して、 オブジェクト・クラスに追加されます。 エラー通知オブジェクト・クラスにオブジェクトを追加できるのは、root ユーザー権限を使用して実行中のプロセスだけです。 エラー通知オブジェクトには、以下のディスクリプターがあります。

en_alertflg
エラーの警報を行えるかどうかを示します。 このディスクリプターは、SNA アラート・アーキテクチャーを使用するネットワーク管理アプリケーションに関連した 警報エージェントによって使用されます。 有効な警報用ディスクリプターの値は次のとおりです。
TRUE
警報を行えます。
FALSE
警報を行えません。
en_class
突き合わせるエラー・ログ・エントリーのクラスを示します。 有効な en_class ディスクリプターの値は次のとおりです。
h
ハードウェア・エラー・クラス
S
ソフトウェア・エラー・クラス
O
errlogger コマンドからのメッセージ
U
未判別
en_crcid
特定のエラーに関連するエラー ID を指定します。 エラー ID は、 事前定義属性 (PdAt) オブジェクト・クラス属性値として有効な任意の数値にすることができます。 errpt コマンドは、エラー ID を 16 進数として表示します。 例えば、 errpt コマンドが IDENTIFIER: 67581038とともに表示するエントリーを選択するには、 en_crcid = 0x67581038と指定します。
en_dup
設定されている場合、カーネルにより定義されている重複エラーが突き合わされるべきかどうかを識別 します。 有効な en_dup ディスクリプターの値は次のとおりです。
はい
エラーは重複している。
いいえ
エラーは重複していない。
en_err64
設定されている場合、64 ビットまたは 32 ビット環境からのエラーが突き合わされるべきかどうかを識別 します。 有効な en_err64 ディスクリプターの値は次のとおりです。
はい
エラーは 64 ビット環境からである。
いいえ
エラーは 32 ビット環境からである。
en_label
errpt -t コマンドの出力で定義された特定のエラー ID に関連するラベルを指定します。
en_method
このエラー通知オブジェクトの選択基準に一致するエラーが記録された場合に実行する、 ユーザーがプログラムできるアクション (シェル・スクリプトまたはコマンド文字列など) を指定します。 エラー通知デーモンは、sh-cコマンドを使ってnotifyメソッドを実行する。

以下のキー・ワードは、 通知メソッドへの引数としてエラー通知デーモンによって自動的に拡張されます。

$1
エラー・ログ・エントリーからのシーケンス番号
2 ドル
エラー・ログ・エントリーからのエラー ID
$3
エラー・ログ・エントリーからのクラス
$4
エラー・ログ・エントリーからのタイプ
$5
エラー・ログ・エントリーからの警報フラグ値
$6
エラー・ログ・エントリーからのリソース名
$7
エラー・ログ・エントリーからのリソース・タイプ
$8
エラー・ログ・エントリーからのリソース・クラス
$9
エラー・ログ・エントリーからのエラー・ラベル
en_name
オブジェクトを固有識別します。 この固有の名前は、オブジェクトを除去する際に使用します。
en_persistenceflg
システムの再始動時に、エラー通知オブジェクトを自動的に除去するかどうかを指定します。 例えば、シグナルのエラーを回避するために、 シグナルを別のプロセスに送信するメソッドの入ったエラー通知オブジェクトを、 システムの再始動から次の再始動に持ち越してはなりません。 送信先のプロセスおよびそのプロセス ID は、 システム再始動間では持続されません。

エラー通知オブジェクトの作成者は、 エラー通知オブジェクトを適切な時に除去する責任があります。 プロセスが終了し、エラー通知オブジェクトの除去に失敗した場合、 en_persistenceflg ディスクリプターによって、 システムの再始動に古いエラー通知オブジェクトが確実に除去されます。

有効な en_persistenceflg ディスクリプターの値を次に示します。

0
非持続 (ブート時に除去される)
1
持続 (ブート時に除去されない)
en_pid
エラー通知オブジェクトを識別するために使用するプロセス ID (PID) を指定します。 PID を指定したオブジェクトの en_persistenceflg ディスクリプターは 0 に設定する必要があります。
en_rclass
失敗したリソースのクラスを示します。 ハードウェアのエラー・クラスの場合、 リソース・クラスはデバイス・クラスです。 ソフトウェアのエラー・クラスの場合、 リソース・エラー・クラスは適用されません。
en_resource
失敗したリソースの名前を示します。 ハードウェアのエラー・クラスの場合、 リソース名はデバイス名です。
en_rtype
失敗したリソースのタイプを示します。 ハードウェアのエラー・クラスの場合、 リソース・タイプは、 デバイス・オブジェクト・クラス内でリソースを指定するためのデバイス・タイプです。
en_symptom
TRUE に設定すると、症状文字列を伴うエラーの通知が可能になります。
en_type
突き合わせるエラー・ログ・エントリーの重大度を示します。 有効な en_type ディスクリプターの値を以下に示します。
情報
通知
PEND
近々使用不可になる可能性
PERM
永続
PERF
受諾不能なパフォーマンス低下
TEMP
一時的
UNKN
不明

  1. タイプ PERM のディスク・エラーがログに記録されるたびにフォーマット済みエラー項目をルートにメール送信する通知メソッドを作成するには、以下のファイルを作成します。/tmp/en_sample.add以下のエラー通知オブジェクトが含まれています。
    errnotify:
        en_name = "sample"
        en_persistenceflg = 0
        en_class = "H"
        en_type = "PERM"
        en_rclass = "disk"
        en_method = "errpt -a -l $1 | mail -s 'Disk Error' root"
    エラー通知オブジェクト・クラスにオブジェクトを追加するには、 次のように入力します。
    odmadd /tmp/en_sample.add
    odmadd コマンドは、 /tmp/en_sample.add に入っているエラー通知オブジェクトを errnotify ファイルに追加します。
  2. エラー通知オブジェクトがオブジェクト・クラスに追加されたことを確認するには、次のように入力します。
    odmget -q"en_name='sample'" errnotify
    odmget コマンドは、以下の en_name 値を持つ errnotify ファイル内のエラー通知オブジェクトを見つけます。"sample"オブジェクトを表示します。 次の出力が戻されます。
    errnotify:
        en_pid = 0
        en_name = "sample"
        en_persistenceflg = 0
        en_label = ""
        en_crcid = 0
        en_class = "H"
        en_type = "PERM"
        en_alertflg = ""
        en_resource = ""
        en_rtype = ""
        en_rclass = "disk"
        en_method = "errpt -a -l $1 | mail -s 'Disk Error' root"
  3. 以下を削除します。sampleエラー通知オブジェクト・クラスからのエラー通知オブジェクト、タイプ:
    odmdelete -q"en_name='sample'" -o errnotify
    odmdelete コマンドは、 en_name 値が errnotify ファイル内のエラー通知オブジェクトを見つけます。 "sample"エラー通知オブジェクト・クラスから削除します。
  4. 重複エラー発生時にルートに電子メールを送信するために、 以下のエラー通知スタンザを含む /tmp/en_sample.add という ファイルを作成します。
    errnotify:
            en_name = "errdupxmp"
            en_persistenceflg = 1
            en_dup = "TRUE"
            en_method = "/usr/lib/dupmethod $1"

    以下のような /usr/lib/dupmethod スクリプトを作成します。

    #!/bin/sh
    # email root when a duplicate error is logged. 
    # We currently don't clear the duplicate from the log.
    # 
    # Input: 
    #   $1 contains the error log sequence number.
    #
    # Use errpt to generate the body of this email. 
    /usr/bin/errpt -al$1 | /usr/bin/mail -s "Duplicate Error Logged" root >/dev/null 
    
    # Now delete that error (currently not done)
    #/usr/bin/errclear -l$1 0 
    exit $?