Приемы профессиональной работы в UNIX


ОСВЕДОМЛЕННОСТЬ ПОЛЬЗОВАТЕЛЯ - часть 6


$ uchk -a russ uucp

Показывает процессы всех администраторов, мои собственные, и процессы uucp по порядку. Все сообщения об ошибках выводятся на стандартное устройство регистрации ошибок, а списки процессов выводятся на стандартное устройство вывода.

ПОЯСНЕНИЯ

Строка 4 - это оператор trap. Символьная строка между двойными кавычками содержит команды, которые должны быть выполнены, когда происходит прерывание. В этом случае мы удаляем временный файл и переадресовываем все выходные данные на нулевое устройство. Когда команда rm пытается удалить несуществующий файл, выводятся сообщения об ошибках. Поскольку мы не знаем, какие файлы могут быть в наличии в тот момент, когда возникнет прерывание, то мы хотим избавиться от сообщений об ошибках. Оператор trap активизируется по выходу из программы (program exit, сигнал 0), разрыву линии (hangup, сигнал 1), прерыванию (interrupt, сигнал 2), выходу (quit, сигнал 3) или программному завершению (software termination, сигнал 15).

В строках 6-10 проверяется, переданы ли какие-либо аргументы. Если вы вызвали uchk без аргументов, выводится сообщение об ошибке и uchk завершается.

В строках 12-16 проверяется, указана ли какая-то опция со знаком минус и является ли она опцией -a - единственно допустимой опцией. Командный файл делает это, применяя команды проверки для сравнения двух различных случаев. Первая проверка вырезает первый символ первого позиционного параметра и смотрит, является ли он символом "-". Следующая проверка делается для того, чтобы увидеть, что первый позиционный параметр не является опцией -a. Поскольку обе проверки соединены операцией AND, то для получения значения "истина" они обе должны быть истинными. Если они обе истинны, выводится сообщение об ошибке и uchk завершается.

Почему мы должны выполнять такую сложную проверку? Проблема в том, что у нас нет иного способа определить, является первый позиционный параметр опцией или нет. Он может быть опцией, а может быть именем, которое нужно искать. Таким образом, мы должны задать вопрос: "Является ли это опцией, и если да, то допустима ли эта опция?"

В строке 18 переменная ADMIN инициализируется символьной строкой, следующей за ней. Это строка, которую вы должны модифицировать в соответствии с вашей системой. Все, что вы должны сделать - это использовать редактор vi и вставить в эту строку имена администраторов, разделенные пробелами. Ниже мы используем переменную ADMIN для обработки аргументов командной строки.

В строках 19-22 проверяется, была ли указана в командной строке опция -a. Если да, эта опция удаляется из командной строки с целью избавления от нее. Строка 21 использует команду set для того, чтобы поместить символьную строку ADMIN в позиционные параметры. Команда set вставляет значение переменной ADMIN, начиная с первого позиционного параметра, и сдвигает все настоящие параметры вправо. Тем самым в цикл for передается множество имен, которые должны быть обработаны.

В строке 24 выполняется команда ps для всех пользователей. Эта команда использует опцию f для вывода большого количества данных. Результат помещается во временный файл, в имени которого применяется идентификационный номер процесса. Этот один большой файл представляет собой источник для остальных распечаток. Возможно, все это немного отстает от реального времени, но программа выполняется гораздо быстрее, чем при многократном вызове команды ps.

Строки 25-29 представляют собой цикл for, который выполняется от $1 до $x, где x - последний позиционный параметр. Для каждого имени выполняется следующее: печатается пустая строка для разделения листинга (строка 27), затем командой fgreps (для ускорения) выбираются из временного файла все процессы, принадлежащие данному пользователю. Благодаря применению команды fgrep для каждого имени пользователя, все процессы данного пользователя печатаются за один раз. Когда закончится проверка всех имен, указанных в командной строке, цикл завершится, завершится командный файл и сработает оператор trap, который удаляет временный файл.




Начало  Назад  Вперед