Рассел Сейдж. Приемы профессиональной работы в unix перевод "Tricks of the unix masters" by Russel G

Вид материалаДокументы

Содержание


Захват данных
Инструментальные средства для коммуникационных линий
Формат вызова
Формат вызова
Пример вызова
Текст программы
Переменные среды выполнения
Доступ из unix в unix
Связывание unix-машин
Подобный материал:
1   ...   31   32   33   34   35   36   37   38   ...   45

UNIX. Вы можете временно выйти для запуска определенной команды,

например:


~!echo "you can run any command here"


Вы можете также перейти в shell и работать так, как вы всегда

работаете:


~!sh


Вы должны, однако, помнить, что вы все еще подключены с помощью

программы cu к последовательному порту, а телефон по-прежнему

подсоединен к удаленной системе до тех пор, пока вы не дадите вручную

команду выхода или отключения телефона, или пока удаленная система не

отключит телефон по тайм-ауту.


ЗАХВАТ ДАННЫХ


Теперь мы умеем найти модем, подключиться к последовательной

линии и установить связь с другой системой. Если мы вызываем доску

объявлений, нам может понадобиться захватывать файлы с целью

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

возможности. Как мы уже отмечали, микро-ЭВМ делают это обычно при

помощи RAM-буфера, который сохраняется на диске, когда он

заполняется. А UNIX не может действовать таким образом.


Простейший способ, придуманный мною для захвата данных из другой

системы - пропустить по конвейеру все, что выдается на терминал,

через команду tee системы UNIX. Весь ввод с вашей клавиатуры не

перехватывается, а все, что идет на стандартное устройство вывода

(stdout) попадает в выходной файл утилиты tee. Это выглядит так:


cu -ltty00 dir | tee файл_перехвата


Одно из последствий перехвата информации таким методом состоит в

том, что все символы возврата каретки, печатаемые из удаленной

системы, попадают в выводной файл команды tee. Вы обнаруживаете их в

виде "M" в конце каждой строки файла. Избавиться от всех этих

возвратов каретки легко, попробуйте выполнить такую

последовательность команд редактора ed:


ed файл_перехвата

1,$s/M//g

w

q


Смысл этих команд следующий. Для каждой строки во всем файле (1,

$) заменить возврат каретки (M) на ничего (//). Сделать это для

произвольного количества символов возврата каретки в отдельной строке

("g" означает глобальную замену в строке). Вы можете превратить

control-M в заменяемую строку либо вводом символа обратной косой

черты (\) и настоящим нажатием на клавишу возврата каретки, либо в

редакторе vi использовать префикс control-V для разрешения ввода

управляющих символов. После редактирования запишите файл и выйдите из

редактора ed.


Конечно, все это вы можете для удобства оформить в виде

командного файла интерпретатора shell.


ИНСТРУМЕНТАЛЬНЫЕ СРЕДСТВА ДЛЯ КОММУНИКАЦИОННЫХ ЛИНИЙ


Две утилиты, которые мы здесь предлагаем, связаны с доступом к

последовательному порту. Когда линия освобождается, вы сразу же

узнаете об этом и можете управлять линией с помощью нескольких

нажатий клавиш.


------------------------------------------------------------------------


ИМЯ: cuchk

------------------------------------------------------------------------


cuchk Cu check - проверка свободной линии для cu


НАЗНАЧЕНИЕ


Опрашивает таблицу состояния процессов и ищет процессы cu. Когда

они завершаются, на ваш экран выдается сообщение и программа

прекращает работу.


ФОРМАТ ВЫЗОВА


cuchk - Сообщить, когда cu освободит линию


ПРИМЕР ВЫЗОВА


cuchk


ТЕКСТ ПРОГРАММЫ


1 :

2 # @(#) cuchk v1.0 Check for a free cu line Author: Russ Sage

Проверка свободной линии для cu


4 if [ "$#" -gt "0" ]

5 then echo "cuchk: too many arguments" >&2

6 echo "usage: cuchk" >&2

7 exit 1

8 fi


10 while :

11 do

12 ps -e | fgrep cu > /dev/null \

13 && sleep 5

14 || { echo "\ncu is free"; exit; }

15 done &


ОПИСАНИЕ


ЗАЧЕМ НАМ НУЖЕН КОМАНДНЫЙ ФАЙЛ cuchk?


Похоже, что большинство систем UNIX скупы на последовательные

порты. Это становится важным моментом, когда имеется только один

выводной порт для шести или семи человек. Опыт показывает, что если

вы не получите доступ к порту сразу, то вам прийдется ждать снова и

снова и вы не будете знать, как долго собирается текущий пользователь

занимать определенный порт. Вместо того чтобы терять время на

постоянную проверку занятости порта, почему бы не поручить машине

сообщить вам, когда этот порт освободится?


ЧТО ДЕЛАЕТ cuchk?


При вызове программы cuchk она запускается в фоновом режиме. Она

управляется бесконечным циклом, обеспечивающим ее работоспособность.

Программа cuchk наблюдает за системой, ведя поиск среди всех активных

процессов. Если она обнаруживает процесс cu (который может работать с

интересующим нас портом, а может и нет), она засыпает на 5 секунд и

снова ведет поиск. Если нет процессов cu, функционирующих на машине,

она выдает сообщение "cu is free" ("cu свободна") и завершается.

Таким образом, мы не обязаны вручную следить за работой cuchk, она

сама запускается и сама завершается. Это имеет смысл, поскольку вся

ценность этой утилиты свелась бы на нет, если бы ее саму нужно было

периодически проверять!


ПОЯСНЕНИЯ


В строках 4-8 выполняется проверка на ошибки. Поскольку cuchk не

имеет никаких опций, в командной строке не должно быть никаких

параметров. Если параметры присутствуют, это считается ошибкой.

Строки 10-15 организуют вечный цикл while. Обратите внимание,

что амперсанд в строке 15 автоматически запускает cuchk в фоновом

режиме, ведь нет никакого резона выполнять эту программу в

приоритетном режиме.

В строке 12 выполняется команда "ps -e", которая выдает

информацию о состоянии всех значительных пользовательских процессов.

Эти данные пропускаются по конвейеру через fgrep. Утилита fgrep ищет

наличие символов "cu". Мы надеемся, что эти символы соответствуют

только процессам cu, которые мы ищем. Они могут, однако, относиться к

чему-то совершенно неожиданному, например "picuser" или к какому-то

аналогично построенному имени. Результат работы команды fgrep

направляется на устройство /dev/null, чтобы избавиться от лишней

информации. Нас интересует только статус завершения команды fgrep. Он

сообщает нам, найдено ли вхождение символов "cu" или нет.

В конце строки 12 присутствует символ обратной косой черты,

указывающий интерпретатору shell, что следующая физическая строчка

является на самом деле частью той же самой программной строки и что

нужно добавить ее к строке 12, а не выполнять самостоятельно.

Разбиение длинных строк на несколько меньших строк с помощью символов

обратной косой черты позволяет нам получать красиво оформленный,

более наглядный исходный код.

Строка 13 выполняется в том случае, если fgrep отработала

успешно (т.е. если она выдает нулевой статус завершения). Это

означает, что символы "cu" найдены, а значит процесс cu работает и в

настоящее время не доступен. Поэтому процесс cuchk засыпает на 5

секунд. Когда он пробуждается, выполнение продолжается со строки 10,

возобновляется вечный цикл и проверка процессов продолжается.

Если fgrep не находит символы "cu" (возвращается ненулевой

статус завершения), то выполняется строка 14, которая выдает

сообщение о том, что программа cu свободна, и работа программы

завершается. Таким образом, мы сразу же знаем, что линия cu открыта

для использования, поэтому мы можем поскорее занять ее.


------------------------------------------------------------------------


ИМЯ: talk

------------------------------------------------------------------------


talk Обращение к последовательному порту


НАЗНАЧЕНИЕ


Выполняет командную строку, подготавливающую последовательный

порт для общения с другой системой.


ФОРМАТ ВЫЗОВА


talk [-bBAUD] [-l] [-tTTY] [-u]


Опции:

-b установить новую скорость обмена


-l протоколировать все поступающие данные


-t использовать другой порт tty


-u использовать принятую в UNIX скорость обмена 9600


ПРИМЕР ВЫЗОВА


talk -b300 -t01 -l


Обратиться к последовательному порту tty01 на скорости 300 бод и

протоколировать выводные данные в текстовый файл.


ТЕКСТ ПРОГРАММЫ


1 :

2 # @(#) talk v1.0 Talk to the serial port Author: Russ Sage

Обращение к последовательному порту


4 BAUD="1200"

5 TTY="tty11"

6 PIPE=""


8 for ARG in $@

9 do

10 case $ARG in

11 -b*) BAUD="`echo $ARG|cut -c3-`";;

12 -l) echo "logging in /tmp/talk.$$"

13 PIPE="| tee /tmp/talk.$$";;

14 -t*) TTY="tty`echo $ARG|cut -c3-`";;

15 -u) BAUD="9600";;

16 *) echo "talk: invalid argument $ARG" >&2

17 echo "usage: talk [-bBAUD] [-l] [-tTTY] [-u]" >&2

18 echo " -b baud rate" >&2

19 echo " -l log the output" >&2

20 echo " -t use another tty" >&2

21 echo " -u 9600 baud to UNIX" >&2

22 exit 1;;

23 esac

24 done


26 eval cu -s$BAUD -l$TTY dir $PIPE


ПЕРЕМЕННЫЕ СРЕДЫ ВЫПОЛНЕНИЯ


ARG Аргумент из командной строки

BAUD Скорость обмена, которую нужно указать программе cu

PIPE Содержит строку, создающую конвейер для захвата данных

TTY Номер используемого порта tty


ОПИСАНИЕ


ЗАЧЕМ НАМ НУЖЕН КОМАНДНЫЙ ФАЙЛ talk?


Регистрация в удаленной системе расширяет горизонты ваших

вычислительных возможностей. Учитывая, что UNIX становится все более

распространенной системой среди микро-ЭВМ, системы UNIX, пригодные

для связи, скоро будут везде. Кроме того, вы можете вызвать из вашей

системы UNIX много систем типа досок объявлений, функционирующих на

микро-ЭВМ.

Нам нужен хороший интерфейс для управления модемной линией и

облегчения ее использования. Нам необходимо захватывать данные, если

это возможно, изменять скорость обмена и менять терминальный порт,

если в этом есть потребность. Все это делает командный файл talk.


ЧТО ДЕЛАЕТ talk?


Программа talk генерирует командную строку, основанную на

подразумеваемой конфигурации. Эта конфигурация такова: 1200 бод,

подключение к терминальной линии /dev/tty11 (последовательный порт 1

в системе SCO XENIX), захват данных не производить. Все

подразумеваемые параметры можно изменить в тексте исходного файла, а

терминальная линия должна быть установлена с учетом специфики вашей

системы.

Если вы хотите изменить скорость обмена, укажите с помощью опции

-b нужную вам скорость (подразумевается, что это одна из стандартных

скоростей, поддерживаемых программой cu). Например,"talk -b2400"

устанавливает скорость 2400 бод. Указанная скорость передается

команде cu, которая непосредственно изменяет характеристики вашего

подключения.

Важно иметь в виду, что эта скорость должна быть определена в

файле L-devices.

Если вы хотите захватить все данные, выводимые на ваш экран,

включите опцию протоколирования, указав -l. Файл с захваченными

данными будет называться /tmp/talk.$$, где $$ - уникальный

идентификатора процесса вашего текущего интерпретатора shell. Это имя

выдается на экран при вызове данной опции, так что вы увидите его на

вашем экране. Уникальность имен файлов обеспечивается для того, чтобы

вы не потеряли по недосмотру регистрационные файлы от предыдущих

сеансов работы (или чтобы, по крайней мере, было очень мало шансов,

что это произойдет).

Если у вас факультативный последовательный порт с модемом или

если вы хотите подключаться к любой из возможных линий, примените

опцию -t. Вместе с этой опцией укажите номер tty, который будет затем

передан в команду cu. Это очень полезная опция, если у вас много

различных линий для использования cu.

Если вы не используете ваш последовательный порт для подключения

модема, а имеете прямое подсоединение к другой системе UNIX, опция -u

тотчас же установит скорость обмена 9600 бод. Заметим, что того же

эффекта можно было бы достичь, указав -b9600, но опцию -u проще

вводить и запоминать.


ПРИМЕРЫ


1. $ talk -l -t12


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

захватывать данные, которые проходят на экране.


2. $ talk -u


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

использованием скорости 9600 бод. Не включать захват данных.


3. $ talk -b2400 -t04 -u


Внимание! Сначала опция -b устанавливает скорость 2400, но далее

следует опция -u, которая переустанавливает значение скорости на

9600.


4. $ talk -u -l -b4800


Снова будьте внимательны! Сначала линия подключается напрямую со

скоростью 9600 бод. Затем включается протоколирование. Наконец,

значение скорости меняется с 9600 на 4800. Если на самом деле линия,

к которой вы обращаетесь, работает на скорости 9600 бод, вы должны,

если это возможно, понизить скорость, нажимая ~%b для генерации

сигнала break.


ПОЯСНЕНИЯ


В строках 4-6 устанавливаются действия, выполняемые программой

talk по умолчанию. Эти действия можно полностью изменить путем

редактирования исходного файла. Главное достоинство этих умолчаний в

том, что если такую конфигурацию вы используете чаще всего, то вам

достаточно просто ввести "talk", без всяких опций.

Строка 4 инициализирует переменную BAUD значением 1200, это

значение по умолчание для скорости модема. Строка 5 присваивает

переменной TTY значение tty11, что соответствует первому

последовательному порту аппаратуры. Обычно нужно tty00, но SCO XENIX

имеет виртуальную консоль, причем tty02-tty10 являются отдельными

экранами, доступ к которым осуществляется с одного консольного

устройства. Если это не так в вашей системе, укажите здесь правильное

значение TTY. В строке 6 переменная PIPE инициализируется пустой

строкой, так как конвейер применяется для протоколирования данных, а

по умолчанию захват данных не выполняется.

Строки 8-24 представляют собой цикл, который перебирает все

аргументы командной строки. В строках 10-23 используется оператор

выбора среди опций для выполнения требуемых функций.

Строка 11 проверяет, начинается ли данная опция с символов -b,

после которых следует что-то еще. Если да, то символы, следующие

после -b, вырезаются и заносятся в переменную BAUD. Обратите

внимание, что именно поэтому вы должны набирать "-b2400", а не "-b

2400".

В строке 12 проверяется, хотите ли вы включить протоколирование.

Если да, то на экран выводится имя протокольного файла, а переменная

PIPE устанавливается так, чтобы направить стандартный вывод по

конвейеру программе tee системы UNIX. Программа tee - это

универсальная конвейерная программа расщепления, которую можно

использовать для посылки копии потока данных в определенный пункт

назначения, не воздействуя на основной конвейер. В данном случае мы

применяем программу tee для посылки данных, проходящих через

последовательный порт, на экран и в наш регистрационный файл

/tmp/talk/.$$. (Если вы представите себе водяную трубу с T-образным

стыком, то поймете, что происходит.)

Строка 14 проверяет, начинается ли опция с -t. Если это так, то

вырезается номер терминала. Здесь можно передать любое значение tty,

но не забывайте, что этот номер tty должен также присутствовать в

файле /usr/lib/uucp/L-devices. Благодаря этому файлу, программа cu

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

В строке 15 проверяется, собираетесь ли вы подключаться к

системе UNIX напрямую. Если да, скорость обмена автоматически

устанавливается на 9600 бод в целях повышения пропускной способности

терминала.

Строки 16-22 выполняют проверку ошибок. Если какая-либо опция,

переданная в командной строке, не соответствует никакому из

предыдущих образцов оператора case, этот факт фиксируется здесь,

выдаются сообщения об ошибках и командный файл завершается.

Строка 26 - это волшебная строка. Поскольку все shell-переменные

получили свои значения, мы можем использовать их в командной строке,

чтобы подставить в нее необходимые значения. Сначала применяется

команда eval. Она раскрывает все имена переменных, заменяя их на

соответствующие значения.

В данном случае мы формируем полную командную строку утилиты cu:

скорость берется из переменной BAUD, линия из TTY, а подсоединение

прямое. Если мы не ведем протоколирование данных, значение PIPE

нулевое и оно будет отброшено при синтаксическом разборе. Если же

переменная PIPE содержит команду для отправки данных в протокольный

файл, команда eval обеспечивает это, организовывая такой конвейер,

как мы указали.


ДОСТУП ИЗ UNIX В UNIX


Теперь давайте рассмотрим полновесное общение двух систем UNIX.

Имеется область, в которой UNIX опередила свое время. Система uucp

позволяет связать несколько машин воедино и создать то, что в

некоторых отношениях является виртуальным окружением, позволяющим вам

работать на любой машине. Функционирование такой сети основано на

удаленной регистрации в системе (cu(1)), дистанционном выполнении

команд (uux(1)), электронной почте (mail(1)), передаче файлов

(uucp(1), uucico(1)) и опознавании узла системы (uname(1) и

uuname(1)).

Поскольку мы занимаемся реализацией коммуникаций типа UNIX-UNIX,

давайте рассмотрим некоторые способы физического соединения

UNIX-машин в одну рабочую среду.


СВЯЗЫВАНИЕ UNIX-МАШИН


В рабочей обстановке машинные конфигурации постоянно меняются в

целях тестирования, из-за аппаратных изменений, перестановок и

переездов и т.д. Планировать конфигурацию ваших машин нужно так,

чтобы она была максимально гибкой, это поможет избежать хаоса и

разлада.

Ваши потребности влияют на то, как вы соедините различные

UNIX-машины. Если имеется блок определения приоритетного запроса к

порту (port contender), вам приходится иметь с ним дело. Одни линии

могут быть подсоединены напрямую, другие напрямую через блок опреде-

ления приоритетного запроса к порту, третьи через модемные коммутато-

ры. Для того чтобы научиться иметь дело со всеми этими возможностями,

попробуем представить эти конфигурации в графическом виде.

Первый тип подключения - прямое подключение (см. рис. 8-7).

Слева показана вызывающая система, справа вызываемая. Вызывающая

система использует последовательный порт для вывода, поэтому на этом

порту не должно быть процесса getty. Инициирующая команда "cu -ltty00

-s9600 dir" обеспечивает подключение к последовательному порту tty00

на очень высокой скорости обмена. Прямые подсоединения могут

поддерживать такую скорость. Сам кабель должен быть выполнен в виде

нулевого модема (рассмотренного ранее в данной главе). В вызываемой

системе задействованы процессы getty, работающие со скоростью 9600

бод на входящей терминальной линии. Когда пользователь вводит

регистрационное имя, getty выполняет процесс login, запрашивающий

пароль, и если этот пароль верный, запускается shell.


Рис. 8-7. Прямое подключение одной системы UNIX к другой

------------------------------------------------------------------------


DTE-1 DTE-2

+---------+ +---------+

| | | |

| UNIX 1 | | UNIX 2 |

| | Нулевой модем | |

| tty00 |-------------------->| tty00 |

| | | |

| | | |

+---------+ +---------+