Извещение об ошибках
Объектный класс Извещение об ошибках определяет условия и действия, выполняемые при записи сообщений об ошибках в протокол ошибок. Эти условия и действия задаются пользователем в объекте извещения об ошибках.
Каждый раз, когда в протокол заносится ошибка, демон извещения об ошибках определяет, совпадает ли запись протокола ошибок с критериями выбора какого-либо объекта класса извещения об ошибках. Для каждого объекта, для которого обнаружено совпадение, демон выполняет запрограммированное действие, называемое также способом извещения.
Объектный класс Извещение об ошибках располагается в файле /etc/objrepos/errnotify. Объекты извещения об ошибках добавляются к объектному классу с помощью команд Администратора объектных данных (ODM). Добавлять объекты в класс извещений об ошибках разрешено только процессам, которые запускаются пользователем root. Объекты извещения об ошибках содержат следующие дескрипторы:
- en_alertflg
- Указывает, следует ли предупреждать об ошибке. Этот дескриптор используется
агентами предупреждений, связанными с программами сетевого управления, с помощью
архитектуры извещения SNA. Допустимы следующие значения дескриптора:
- TRUE
- извещение разрешено
- FALSE
- извещение запрещено
- en_class
- Идентифицирует класс записей протокола ошибок, проверяемых на
совпадение. Допустимы следующие значения дескриптора en_class:
- H
- Класс аппаратных ошибок
- S
- Класс программных ошибок
- 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
- Определяет запрограммированное пользователем действие
(например, сценарий оболочки или строку команд), которое выполняется
при занесении в протокол ошибки, совпадающей с критериями выбора
данного объекта извещения об ошибках. Для выполнения этого действия
демон извещения об ошибках применяет команду
sh -c.
Ниже перечислены ключевые слова, которые автоматически развертываются демоном извещения об ошибках как аргументы способа извещения.
- $1
- Порядковый номер записи в протоколе ошибок
- $2
- ИД ошибки из записи в протоколе ошибок
- $3
- Класс из записи в протоколе ошибок
- $4
- Тип из записи в протоколе ошибок
- $5
- Значения флагов предупреждений из записи в протоколе ошибок
- $6
- Имя ресурса из записи в протоколе ошибок
- $7
- Тип ресурса из записи в протоколе ошибок
- $8
- Класс ресурса из записи в протоколе ошибок
- $9
- Метка ошибки из записи в протоколе ошибок
- en_name
- Однозначно идентифицирует объект. Это уникальное имя используется при удалении объекта.
- en_persistenceflg
- Указывает, должен ли объект извещения об ошибках автоматически
удаляться при повторном запуске системы. Например, чтобы избежать
ошибочной генерации сигнала, при повторном запуске системы не должны
сохраняться объекты извещения об ошибках, которые содержат действия,
отправляющие сигнал другому процессу.
При
повторном запуске системы процесс, который принимает сигнал, и его
идентификатор не сохраняются.
За удаление объекта извещения об ошибках в нужное время отвечает его создатель. В том случае, когда процесс завершается без удаления объекта извещения об ошибках, дескриптор en_persistenceflg гарантирует, что при повторном запуске системы устаревшие объекты извещения об ошибках будут удалены.
Допустимы следующие значения дескриптора en_persistenceflg:
- 0
- объекты не сохраняются (удаляются во время загрузки)
- 1
- объекты сохраняются (не удаляются во время загрузки)
- en_pid
- Задает идентификатор процесса (PID), который будет использоваться при идентификации объекта извещения об ошибках. Для объектов с указанным PID дескриптор en_persistenceflg должен быть равен 0.
- en_rclass
- Идентифицирует класс ресурса, в котором происходит сбой. В классе аппаратных ошибок класс ресурса - это класс устройства. В классе программных ошибок это понятие неприменимо.
- en_resource
- Идентифицирует имя ресурса, в котором происходит сбой. В классе аппаратных ошибок имя ресурса - это имя устройства.
- en_rtype
- Идентифицирует тип ресурса, в котором происходит сбой. В классе аппаратных ошибок тип ресурса - это тип устройства, заданное в объектном классе "устройства".
- en_symptom
- Разрешает извещение об ошибке, сопровождаемое строкой признаков, если равен TRUE.
- en_type
- Идентифицирует уровень серьезности записей протокола ошибок,
проверяемых на совпадение. Допустимы следующие значения дескриптора
en_type:
- INFO
- Информационная запись
- PEND
- Угроза потери доступности
- PERM
- Постоянная ошибка
- PERF
- Недопустимое снижение производительности
- TEMP
- Случайная ошибка
- UNKN
- Неизвестная ошибка
Примеры
- Для создания способа извещения, который
будет отправлять пользователю root отформатированную запись об ошибке
каждый раз, когда запись об ошибке на диске типа 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, в файл errnotify.odmadd /tmp/en_sample.add - Для того чтобы проверить, добавлен ли
объект извещения об ошибках в объектный класс, введите:
Команда odmget находит объект извещения об ошибках с именем en_name = "sample" в файле errnotify и показывает его. Вывод команды выглядит следующим образом:odmget -q"en_name='sample'" errnotifyerrnotify: 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" - Для удаления объекта sample из класса
объектов Error Notification введите:
Команда odmdelete находит объект извещения об ошибках с именем en_name = "sample" в файле errnotify и удаляет его из объектного класса извещения об ошибках.odmdelete -q"en_name='sample'" -o errnotify - Для того чтобы отправить пользователю 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 # Отправка пользователю root электронного сообщения о повторяющейся ошибке. # Повторное сообщение из протокола не удаляется. # # Ввод: # $1 содержится порядковый номер в протоколе. # # Тело сообщения создается с помощью errpt. /usr/bin/errpt -al$1 | /usr/bin/mail -s "Duplicate Error Logged" root >/dev/null # Удаление сообщения об ошибке (еще не выполнено) #/usr/bin/errclear -l$1 0 exit $?