Linux и UNIX: программирование в shell. Руководство разработчика
Шрифт:
# сценарий evalit
echo " Total number of arguments passed is $#"
echo " The process ID is $$"
echo "' Last argument is "$(eval echo \$$)
При выполнении этого сценария получим следующий результат (ID процесса может отличаться от случая к случаю):
$ evalit alpha bravo charlie
Total number of arguments passed is 3
The process ID is 780
Last argument is Charlie
В этом сценарии команда eval сначала оценивает значение переменной $$ в сравнении с ID процесса, а при выполнении второго прохода производится оценка последнего параметра, передаваемого переменной.
26.4.2. Присвоение значения имени переменной
Можно также поставить в соответствие полю данных имя переменной. Рассмотрим, что это означает на практике. Предположим, что в нашем распоряжении имеется следующий файл:
$ pg data
PC 486 MONITOR svga NETWORK yes
Нам необходимо, чтобы первому столбцу текста соответствовали имена переменных, а второму столбцу текста — значения соответствующих переменных. При этом должно отображаться следующее:
echo $PC
466
Как же можно достичь желаемого результата? Ниже приведен соответствующий сценарий, использующий команду eval.
$ pg eval_it
#!/bin/sh
#сценарий eval_it
while read NAME TYPE
do
eval `echo "${NAME}=${TYPE}"`
done < data
echo "You have a $PC pc, with a $MONITOR monitor"
echo "and have you network? $NETWORK"
Рассмотрим, как функционирует сценарий. Сначала берутся значения рс и 486, которые присваиваются переменным name и type соответственно. При первом проходе команда eval отображает на экране два значения переменных, PC и 486; во время выполнения второго прохода вместо переменной name подставляется значение рс, а вместо переменной type — значение 486. При выполнении сценария получаются следующие результаты:
$ eval_it
You have a 486 рс, with a svga monitor and have you network? yes
Команда eval не слишком часто применяется в сценариях, однако ее удобно использовать при оценке значения переменной, выполняемой более одного раза.
26.5. Команда logger
В системе поддерживается достаточно много журнальных файлов. Некоторые из них, именуемые messages, обычно размещены в каталоге /var/adm или /var/log. Сообщения, регистрируемые в этом файле, передаются с помощью файла конфигурации syslog и имеют строго заданный формат. Чтобы убедиться, что система сконфигурирована для генерирования сообщений из программ, проверьте файл /etc/syslog.conf. Этот файл содержит описания приоритетов и свойств, которые программа может использовать для отсылки различных типов сообщений.
Здесь мы не будем подобно рассматривать, каким образом UNIX либо Linux регистрирует сообщения в файле. Все, что вам требуется пока знать, это номера различных уровней сообщений (от информационных до критических).
Сообщения могут отсылаться в файл с помощью команды logger. Перед тем как использовать эту команду, нужно обратиться к справочной странице man, так как различные версии этой команды могут иметь отличающийся синтаксис. Поскольку в этой главе рассматриваются только информационные сообщения, нужно обратить внимание на соответствующие команды, рассматриваемые далее.
Необходимость отправки сообщений в файл диктуется одной из следующих причин:
• количество попыток доступа/регистрации за определенный период;
• критическая обработка одного из сбойных сценариев;
• мониторинг отчетов сценариев.
Ниже показано, как выглядит файл /var/adm/messages. Формат этого файла может немного отличаться от данного образца:
$ tail /var/adm/messages
Jun 16 20:59:03 localhost login[281]: DIALUP AT ttyS1 BY root
Jun 16 20:59:03 localhost login[281]: ROOT LOGIN ON tty$1
Jun 16 20:59:04 localhost PAM_pwdb [281] : (login) session closed for user root
Jun 16 21:56:38 localhost named[211: Cleaned cache of 0 RRs]
Jun 16 21:56:39 localhost named[211]: USAGE 929570318 929566719
Jun 16 21:56:39 localhost named[211]: NSTATS 929570318 929566719
Общий формат команды logger выглядит так:
logger -p -i message
Параметры этой команды выполняют следующие функции:
– p Определяет приоритет; в данном случае затрагивается только файл user.notice,
который всегда является используемым по умолчанию
– i Регистрирует ID процесса для каждого сообщения
26.5.1. Использование команды logger
В командной строке интерпретатора shell введите следующую команду:
$ logger -p notice "This is a test message. Please Ignore $LOGNAME"
Возможно, вам придется подождать пару минут, пока не отобразится информация о регистрации сообщения.
$ tail /var/adm/messages
Jun 17 10:36:49 acers6 dave: This is a test message. Please Ignore dave
Из приведенного примера видно, что регистрируется, пользователь, выполняющий регистрацию сообщения.
А теперь создадим небольшой сценарий, регистрирующий сообщение, в котором говорится о количестве пользователей в системе. Данный сценарий может использоваться для оценки интенсивности ежедневной загрузки системы. Для этого нужно просто запускать его из файла crontab примерно каждые 30 минут.
$ pg test_logger
#!/bin/sh
# test_logger
logger -p notice "`basename $0`: there are currently `who |wc -l` users on the system"
Запустим сценарий.
$ test_logger
Теперь отобразим содержимое файла сообщений.
$ tail /var/adm/messages
Jun 17 11:02:53 acers6 dave: test_logger:there are currently 15 users on the system
26.5.2. Использование команды logger в сценариях
Регистрацию сообщений лучше использовать в том случае, когда осуществляется безусловное прерывание выполнения одного из сценариев. Для регистрации этих типов сообщений просто включите команду logger в функции, выполняющие перехват сигналов при выходе из сценария.
В следующем сценарии очистки при получении любого из сигналов с номерами 2, 3 или 15 производится регистрация сообщения.
$ pg cleanup
#!/bin/sh
#cleanup
#очистка журнальных файлов системы
trap "my_exit" 2 3 15
my_exit {
# my_exit
logger -p notice "`basename $0`: Was killed while cleaning up system logs..CHECK OUT ANY DAMAGE"
exit 1
}
tail -3200c /var/adm/utmp > /tmp/utmp
mv /tmp/utmp /var/adm/utmp
>/var/adm/wtmp