Perl для системного администрирования



         

Пропуск темы сообщения Строка



Недостаточная информация в теле сообщения

Эта ошибка попадает в ту же категорию, что и предыдущая. Если сценарий собирается сообщать о проблемах или ошибках в почтовых сообщениях, значит сгенерировать какую-то информацию, которая должна там присутствовать. Они сводятся к каноническим вопросам журналистики:

Кто?

Какой сценарий сообщает об ошибке? Добавьте содержимое переменной $0 (если не устанавливали ее явно), чтобы показать полный путь к текущему сценарию. Сообщите о версии сценария, если таковая у него имеется.

Где?

Сообщите что-то о том месте в сценарии, где возникает проблема. Функция caller () из Perl возвращает всю нужную для этого информацию:

замечание: то, что возвращает са!1ег(). может зависеть от

версии Perl, так что обязательно загляните в документацию по perlfunc

(Spackage, $filename, $line, $subroutine, Shasargs,

$wantarray, Sevaltext, $is_require) = caller($frames);

Где $f rames - это количество нужных фреймов на стеке (если вызывались подпрограммы из подпрограмм). Чаще всего вы будете устанавливать $f rames в 1. Вот пример списка, возвращаемого функцией caller() в середине кода для сервера из последнего полного примера:

('main','repserver1,32,'main:iprintmail1,1,undef)

Подобная запись указывает, что сценарий, запущенный из файла repserver в строке 32, находился в пакете main. В этот момент выполнялся код из подпрограммы main: .printmail (у нее есть аргументы, кроме того, она не вызывается в списочном контексте).

Если вы не хотите вручную применять caller(), можете воспользоваться отчетом о проблемах, предоставляемым модулем Carp.

Когда?

Опишите состояние программы в момент возникновения ошибки. К примеру, какой была последняя строка прочтенных данных?

Почему?

Если сумете, ответьте на незаданный читателем вопрос: «Зачем беспокоить меня этим почтовым сообщением?» Ответ может быть очень простым, например: «данные об учетных записях не были полностью обработаны», «DNS-сервер сейчас недоступен» или «в серверной пожар». Это даст читающему представление о предмете разговора (и, возможно, побудит к изучению).

Что?

Ну и наконец, надо сказать о том, что же пошло не так раньше всего. Вот небольшой пример на Perl, который охватывает все эти пункты:

use ext::Wrap;

sub problemreport {

9 $shortcontext - описание проблемы в одной строке

# Susercontext - подробное описание проблемы Получение почты 315

Snextstep - лучшее предположение о том, что делать, чтобы исправить

проблему

my($shortcontext,Susercontext,Snextstep) = @_: my

($filename, $line, Ssubroutine) = (caller(1) )[1,2,3]:

push(@return,"Проблема с Sfilename $shortcortext\n '):

push(@return,"** Сообщение о проблеме с Sfilename ***\n\n"):

push(@return,fill("","","- Проблема: Susercontext") "\r\n")

push(@return,"- Место: строка Sline файла Sfilename в

$subroutine\n\n"); push(@return,"- Произошла: ".scalar localtime(time)."\n\n");

push(@return,"- Дальнейшие действия: $nextstep\n"):

\@return; }

sub fireperson {

Sreport = &problemreport("компьютер горит ", «EOR, «EON);

При составлении отчета загорелась задняя часть компьютера.

Случилось это сразу же после обработки пенсионного плана для ORA. EOR

Пожалуйста, потушите пожар, а потом продолжайте работу. EON

print @{$report}; } &fireperson;

Обращение к &problemreport выведет, начиная с темы сообщения, отчет о проблеме, согласующийся с Mail: : Mailer, как и в предыдущих примерах.

Теперь, разобравшись с отправкой почты, перейдем к другой стороне медали.



Содержание Назад Вперед