错误通知

错误通知对象类指定错误被记录到系统错误日志中时的条件和要采取的操作。 用户在“错误通知”对象中指定这些条件和操作。

每次记录错误时,错误通知守护程序确定错误日志条目是否匹配任何“错误通知”对象的选择标准。 如果匹配存在,守护程序为每个匹配的对象运行程序控制的操作,也称为通知方法

“错误通知”对象类位于 /etc/objrepos/errnotify 文件中。 “错误通知”对象通过使用对象数据管理器 (ODM) 命令添加到对象类。 只有以 root 用户权限运行的进程可以将对象添加到“错误通知”对象类。 “错误通知”对象包含下列描述符:

en_alertflg
标识错误是否可以被警报。 此描述符提供给与使用 SNA 警报体系结构的网络管理应用程序关联的警报代理程序使用。 有效的警报描述符值为:
TRUE
可以被警报
FALSE
不可被警报
en_class
标识要匹配的错误日志条目的类。 有效的 en_class 描述符值为:
H
硬件错误类
软件错误类
O
来自 errlogger 命令的消息
u
未确定
en_crcid
指定与特定错误关联的错误标识。 错误标识可以是作为 预定义属性 (PdAt) 对象类属性值有效的任何数字值。 errpt 命令以十六进制显示错误标识。 例如,要选择 errpt 命令与 IDENTIFIER: 67581038一起显示的条目,请指定 en_crcid = 0x67581038
en_dup
如果设置,标识是否应匹配内核定义的重复的错误。 有效的 en_dup 描述符值为:
TRUE
错误是一个重复。
FALSE
错误不是一个重复。
en_err64
如果设置,标识应匹配来自 64 位环境还是 32 位环境的错误。 有效的 en_err64 描述符值为:
TRUE
错误来自 64 位环境。
FALSE
错误来自 32 位环境。
en_label
指定与 errpt -t 命令的输出中定义的特定错误标识相关联的标签。
en_method
指定匹配此“错误通知”对象选择标准的错误被记录时要运行的用户可编程的操作,例如 shell 脚本或命令字符串。 错误通知守护进程使用sh-c命令来执行通知方法。

错误通知守护程序自动扩展下列关键字作为通知方法的参数。

$1
来自错误日志条目的序号
$2
来自错误日志条目的错误标识
$3
来自错误日志条目的类
$4
来自错误日志条目的类型
$5
来自错误日志条目的警报标记值
$6
来自错误日志条目的资源名称
$7
来自错误日志条目的资源类型
$8
来自错误日志条目的资源类
$9
来自错误日志条目的错误标签
en_name
唯一标识对象。 此唯一的名称在除去对象时使用。
en_persistenceflg
指定重新启动系统时是否应自动除去“错误通知”对象。 例如,要避免错误地发送信号,包含发送信号至其他进程的方法的“错误通知”对象在系统重新启动时不应该继续存在。 接收进程及其进程标识在系统重新启动时不继续存在。

“错误通知”对象的创建程序负责在合适的时间除去“错误通知”对象。 如果进程终止并无法除去“错误通知”对象, en_persistenceflg 描述符确保在重新启动系统时将陈旧的“错误通知”对象除去。

有效的 en_persistenceflg 描述符值为:

重大安全事件数量
不继续存在(引导时除去)
第 1 年
继续存在(引导后继续存在)
en_pid
指定标识“错误通知”对象中使用的进程标识 (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 的磁盘错误时将格式化错误条目发送到 root 用户,请创建名为/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 命令在 errnotify 文件中查找具有 en_name 值的错误通知对象 "sample"并将其从 "错误通知" 对象类中除去。
  4. 要在重复发生错误时将电子邮件发送给 root 用户,请创建名为 /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 $?