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


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


1. $ LIST="root bin" watch daemon

Если переменная LIST не была инициализирована внутри самого командного файла watch, то мы можем инициализировать ее на командном уровне shell'а, а затем вызвать watch. Список пользователей для watch будет такой: root, bin и daemon по порядку, поскольку watch добавляет имена, указанные в ее командной строке к именам, имеющимся в переменной LIST. Такой способ указания имен более гибок, чем жесткое программирование части списка в тексте командного файла watch, но он требует помнить больше информации и больше нужно набирать на клавиатуре.

2. echo "Watch (y/n): \c" read ANS if [ "$ANS" = "y" ] then watch fi

Это фрагмент, который вы можете вставить в ваш .profile. Когда вы регистрируетесь, вам автоматически предлагается запустить watch. Если вы ответите "y", watch станет фоновой задачей и запустится по умолчанию (просматривая пользователей согласно списку в переменной LIST). Если будет введен любой символ, отличный от y, watch не запустится.

ПОЯСНЕНИЯ

Строки 4-9 выполняют проверку на наличие ошибок в опциях командной строки. Для первого позиционного параметра проверяется, что он имеет тире и не является единственной допустимой опцией "-k". Если результатом проверки является истина, печатается сообщение об ошибке и командный файл завершается.

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

Если же файл .watch имеется, то в строке 14 используется команда kill для уничтожения фонового процесса watch. Напомним, что при использовании опции -k мы подразумеваем, что watch был вызван ранее, поэтому файл $HOME/.watch имеет идентификационный номер самого процесса watch. В строке 15 удаляется временный файл watch и в строке 16 происходит выход из программы. Теперь командный файл watch более не выполняется как фоновый.

Строка 20 выполняется, если опция -k не была указана или если нет файла .watch. (Последнее может произойти, если пользователь пытается уничтожить процесс, забыв, что он уже был уничтожен.) Если опция -k не была указана, мы можем считать, что watch был вызван, чтобы стать фоновым процессом и выполнять свою работу. Для того чтобы сделать это, текущий процесс отображает свой идентификатор процесса в файл .watch. Этот файл остается в вашем регистрационном каталоге до тех пор, пока он не будет удален вручную или же изменен путем повторного запуска watch.

В строке 22 инициализируется переменная LIST. Ее значением является символьная строка с именами, разделенными пробелами. Вам нужно вручную отредактировать переменную LIST перед запуском в вашей системе. Просто уберите ее нынешнее содержимое и вставьте туда имена администраторов вашей системы. Если в командной строке будут указаны дополнительные имена пользователей, они будут добавлены в переменную LIST посредством символов расширения параметров $*. Тем самым переменная LIST станет основным списком всех имен пользователей, за которыми будет вестись наблюдение.

Строки 24-36 выполняют цикл постоянного наблюдения. В начале каждой итерации с помощью команды who создается список имен пользователей, который передается циклу for в строке 26. Цикл for использует командную подстановку для получения списка слов, образованного из первого поля команды who. Каждое зарегистрированное имя сравнивается со списком предварительно определенных имен, за которыми мы наблюдаем. Обратите внимание, что внешний цикл while сам себя помещает на выполнение в фоновом режиме. Это означает, что вам нет необходимости вводить это с клавиатуры.

Строки 29-33 управляют внутренним циклом, который проходит по именам, содержащимся в нашем основном списке, и сравнивает их с именами, полученными от команды who. Когда имя, полученное от команды who (имя зарегистрированного пользователя) совпадает с именем в нашем списке, на экран выводится сообщение о том, что данное лицо зарегистрировалось.

После того как все имена проверены, командный файл watch приостанавливается на 10 секунд (строка 35). Когда он снова пробуждается, выполняется следующая итерация вечного цикла while. Все зарегистрированные имена вновь сравниваются со списком. Это будет продолжаться до тех пор, пока вы не прекратите выполнение watch. Как отмечалось ранее, watch можно легко уничтожить с помощью опции -k или же вручную путем ввода команды "kill `cat $HOME/.watch`".

МОДИФИКАЦИИ




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