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

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

Содержание


Пример вызова
Переменные среды выполнения
Формат вызова
Текст программы
Переменные среды выполнения
Подобный материал:
1   ...   33   34   35   36   37   38   39   40   ...   45

u - разблокировать все терминальные линии (ОСТОРОЖНО:

это может нарушить сеанс работы)

w - отобразить регистрационный файл за последнюю неделю


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


uust Динамически отображать регистрационный файл, чтобы

следить за транзакциями uucp


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


1 :

2 # @(#) uust v1.0 Uucp status utility Author: Russ Sage


4 if [ $# -gt 0 ]

5 then echo "uust: argument error" >&2

6 echo "usage: uust" >&2

7 exit 1

8 fi


10 UUNODE=`uuname -l`

11 echo "

12 UUST MENU system node: $UUNODE

13 ---------

14 c - connect with another system in debug mode

15 d - show files in your directory under PUBDIR

16 f - long list files in the spool directory

17 l - display the logfile dynamically

18 r - reconnect with another system

19 s - give user summary of transactions

20 u - unlock the tty line

21 w - display logfile for the last week

22 - exit program


24 Press c,d,f,l,r,s,u,w,or : \c"

25 read CMD


27 case $CMD in

28 "") exit 0;;

29 c) echo "\nSystem name ( to exit): \c"

30 read SYSTEM

31 if [ "$SYSTEM" = "" ]

32 then exit 0

33 fi

34 echo "\nrm /usr/spool/uucp/STST.$SYSTEM : \c"

35 rm /usr/spool/uucp/STST.$SYSTEM 2>/dev/null \

36 && echo "" || echo "no STST files"

37 echo "\n/usr/lib/uucp/uucico -r1 -x4 -s$SYSTEM:"

38 /usr/lib/uucp/uucico -r1 -x4 -s$SYSTEM;;

39 d) echo "\n/usr/spool/uucppublic/$LOGNAME:"

40 ls -l /usr/spool/uucppublic/$LOGNAME;;

41 f) echo "\n/usr/spool/uucp:"

42 ls -l /usr/spool/uucp | more;;

43 l) echo "\n/usr/spool/uucp/LOGFILE:"

44 tail -20f /usr/spool/uucp/LOGFILE;;

45 r) echo "\nSystem name ( to exit): \c"

46 read SYSTEM

47 if [ "$SYSTEM" = "" ]

48 then exit 0

49 fi

50 echo "\nrm /usr/spool/uucp/STST.$SYSTEM : \c"

51 rm /usr/spool/uucp/STST.$SYSTEM 2>/dev/null \

52 && echo "" || echo "no STST files"

53 echo "uusub -c$SYSTEM:"

54 if [ -f /xenix ]

55 then /usr/bin/uusub -c$SYSTEM

56 else /usr/lib/uucp/uusub -c$SYSTEM

57 fi

58 tail -20f /usr/spool/uucp/LOGFILE;;

59 s) echo "\nuulog -u$LOGNAME:"

60 uulog -un$LOGNAME | more;;

61 u) echo \\nrm /usr/spool/uucp/LCK* :

62 rm /usr/spool/uucp/LCK* 2>/dev/null || echo "no lock files";;

63 w) echo "\n/usr/spool/uucp/Log-WEEK:"

64 more /usr/spool/uucp/Log-WEEK;;

65 *) echo "uust: invalid argument '$CMD'" >&2;;

66 esac


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


CMD Содержит символ входной команды, поступивший из

стандартного ввода

LOGNAME Содержит ваше регистрационное имя

SYSTEM Узловое имя uucp той системы, в которую вы обращаетесь

UUNODE Узловое имя uucp локальной системы


ОПИСАНИЕ


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


Многие области системы UNIX являются фактически самостоятельными

подсистемами. Uucp одна из них. Она использует конфигурационные

файлы, файлы подкачки (spool files), файлы блокировки (lock files) и

имеет много исполняемых модулей, образующих целую систему. Если вы

интенсивно используете uucp, вы часто занимаетесь просмотром

регистрационных файлов, очисткой каталогов после аварийных завершений

работы uucp и наблюдением за системой в целом. Если делать все это

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

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

сокращает издержки и облегчает использование утилиты uucp.


ЧТО ДЕЛАЕТ uust?


Uust - это управляемый с помощью меню интерфейс, предоставляющий

основные служебные функции, необходимые для среды uucp. Вам нужно

набрать только команду uust, а затем требуемые опции.

Вполне возможно также, что вы обнаружите трудосберегающие

функции, о которых вы не знали раньше.

Первое, что печатает данные командный файл - это главное меню:


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


|

| UUST MENU system node: russ

| ---------

| c - connect with another system in debug mode

| d - show files in your directory under PUBDIR

| f - long list files in the spool directory

| l - display the logfile dynamically

| r - reconnect with another system

| s - give user summary of transactions

| u - unlock the tty line

| w - display logfile for the last week

| - exit program

|

| Press c,d,f,l,r,s,u,w,or :


Первая опция 'c' предназначена для подключения линии uucp в

отладочном режиме. Эта опция генерирует такую же командную строку,

как при ручном способе запуска процесса uucico (см. предыдущий

раздел). Uust запрашивает у вас имя системы, к которой вы хотите

подключиться.

Следующая опция 'd' дает длинноформатный листинг файлов вашего

каталога, определяемого вашей переменной $PUBDIR, т.е.

/usr/spool/uucppublic/$LOGNAME. Если вы часто делаете пересылки с

помощью uucp, здесь может собраться много файлов. Данная опция

предоставляет вам простой способ их просмотра.

Опция 'f' выдает длинноформатный листинг всех файлов,

находящихся в каталоге подкачки. Выход команды "ls -l" передается по

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

файлов. Этот каталог является сердцем исполняющей системы uucp. Почти

все находится или в этом каталоге, или как-то связано с ним.

Опция 'l', видимо, наиболее часто используемая во всей утилите.

Она позволяет увидеть в динамике функционирование uucp, наблюдая за

регистрационным файлом. При первом вызове она печатает последние 20

строк этого файла, а затем ведет наблюдение, пока не будет

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

этой команды с помощью uust равно 5: 4 для вызова uust и 1 для

указания опции меню. Для того чтобы набрать ту же команду вручную,

требуется 31 символ. Вот где экономия времени и избавление от лишних

проблем!

Очень интересна опция 'r'. Укажите ей имя системы - и она

установит связь с этой системой при помощи uucp. Используемый при

этом метод отличается от метода, применяемого в опции 'c', но

работает в System V. Отметим, однако, что в большинстве систем

команда uusub, задействованная здесь, требует возможностей

суперпользователя. Uusub возвращает управление обратно вашему

интерпретатору shell, но затем запускает uucp в фоновом режиме. Когда

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

хвост регистрационного файла, как описано выше. После этого вы можете

наблюдать все действия uucp по вызову, передаче файлов и завершению

работы.

Опция 's' показывает все ваши транзакции к утилите uucp, выбирая

из регистрационного файла только то, что относится к вашему имени.

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

команде more в целях удобства чтения.

Следующую опцию 'u' нужно использовать с большой осторожностью.

Она удаляет файлы блокировки, устанавливаемые системой uucp для самой

себя. Если в это время uucp работает, другой пользователь может

обратиться при помощи cu к линии и все разрушить. Эти файлы

блокировки существуют также, когда кто-то применяет cu на

последователной линии. Данная опция предусмотрена по той причине, что

иногда uucp или cu завершается аварийно. Когда такое происходит,

нужно удалить файлы блокировки, чтобы начать все сначала. Эту опцию

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

эксперимента, чтобы посмотреть, что при этом может произойти.

Последняя опция 'w' предназначена для отображения из

регистрационного файла тех транзакций uucp, которые относятся к

последней неделе. Это нетрудно сделать, но если бы вы искали

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

поиска символьных строк команды more.


ПРИМЕР


$ uust

r


Это попытка повторного подключения к линии uucp. Ее можно

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

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

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

файлы, оставшиеся после предыдущих аварийных завершений, и произвести

вызов.


ПОЯСНЕНИЯ


Uust является однопроходной утилитой, т.е. не имеет внутренних

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

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

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

коорая используется некоторыми опциями меню. Однако, клавиша break

прекращает все, даже выполнение uust. Не имеет смысла делать

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

В строках 4-8 выполняется проверка командной строки на наличие

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

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

Строка 10 инициализирует переменную UUNODE текущим именем uucp

той системы, в которой вы работаете. Это обеспечивается вызовом

утилиты uuname.

Строки 11-24 отображают главное меню одним большим оператором

echo. Имя системы, поступившее в переменную UUNODE, выдается для

справки в правой верхней части экрана.

В строке 25 читается ответ пользователя, а строки 27-66

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

каретки, это соответствует строке 28, и программа завершается.

Строки 29-38 обрабатывают команду 'c' - подключение в отладочном

режиме. Запрашивается имя системы и проверяется, не пустое ли оно.

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

строка 34 сообщает, что uust пытается удалить все файлы STST, которые

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

системе, вы должны удалить все файлы STST. Если таких файлов нет,

команда rm не срабатывает и выдается сообщение "no STST files".

Строки 39-40 выполняют опцию 'd'. Сначала отображается для

справки название каталога, который мы просматриваем. Затем

распечатывается каталог PUBDIR в длинном формате. Заметим, что

LOGNAME соответствует любому пользователю, запустившему данную

программу, поэтому нет необходиvости вписывать в текст программы

какое-то значение.

В строках 41-42 аналогичным образом обрабатывается опция 'f'. Мы

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

Команда 'l' в строках 43-44 сообщает, что отображается

регистрационный файл. Затем используется команда "tail -f". Опция -f

означает, что нужно производить отображение того, что находится в

файле следующим образом: как только транзакции печатаются в файл, они

отображаются на ваш экран. Пользователь должен нажать клавишу break

для выхода из программы.

Строки 45-58 выполняют команду 'r', которая пытается произвести

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

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

файлы STST и выдаем сообщение о том, было ли это удаление успешным.

Затем печатается сообщение о том, что запускается процесс uusub. В

строке 54 проверяется, является ли корневым файлом XENIX. Если это

так, то утилита uusub вызывается с учетом ее нового местонахождения в

системе XENIX. В противном случае она вызывается с указанием ее

обычного местонахождения - /usr/lib/uucp. После выполнения uusub

отображается динамический хвост регистрационного файла, пока

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

завершается.

В строках 59-60 выполняется проверка сводки о транзакциях.

Используется команда uulog, ей передается LOGNAME текущего

пользователя. Подробности о команде uulog можно найти в документации.

Опция 'u' рассматривается в строках 61-62. Сначала отображается

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

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

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

выдается сообщение об ошибке, указывающее на отсутствие файлов

блокировки.

Строки 63-64 запускают опцию 'w', чтобы посмотреть деятельность

uucp за последнюю неделю. С помощью команды more печатается файл

LogWEEK. Этот файл создается утилитой uucp, чтобы обеспечить сжатую

сводку о работе в течение недели.

Строка 65 соответствует любым командам, которые не были

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

сообщение об этом. Когда выполнение программы доходит до этого места,

она завершается.


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


ИМЯ: uutrans

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


uutrans Передача файловых деревьев из одной системы

UNIX в другую систему UNIX


НАЗНАЧЕНИЕ


Копирует полную иерархию файловой системы с помощью uucp в

другую систему UNIX и поддерживает структуру файлового дерева.


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


uutrans


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


cd $HOME/backup

uutrans

remote

~russ


Начиная с подкаталога backup моего регистрационного каталога,

запустить uutrans с целью передачи всех моих файлов. Файлы посылаются

в систему remote и размещаются там в моем регистрационном каталоге

(/usr/russ).


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


1 :

2 # @(#) uutrans v1.0 Transfer file trees via uucp

3 # Author: Russ Sage

4 if [ $# -gt 0 ]

5 then echo "uutrans: argument count error" >&2

6 echo "usage: uutrans" >&2

7 exit 1

8 fi


10 SELF=`uuname -l`


12 echo "source directory( to exit): \c"

13 read SOURCE

14 if [ "$SOURCE" = "" -o ! -d "$SOURCE" ]

15 then exit 1

16 fi


18 echo "\ndestination system( for $SELF): \c"

19 read SYSTEM

20 echo "\ndestination directory( for ~/$LOGNAME): \c"

21 read DEST


23 : ${SYSTEM:="$SELF"}

24 : ${DEST:="~/$LOGNAME"}


26 echo "\nQUEUEING:"


28 find $SOURCE -type f -print | sort | while read FILE

29 do

30 echo $FILE

31 uucp -c -d -r $FILE $SYSTEM!$DEST/$FILE

32 done


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


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

FILE Определенный копируемый файл

LOGNAME Содержит регистрационное имя

SELF Содержит узловое имя текущей системы

SOURCE Источник всех копируемых файлов

SYSTEM Имя системы, в которую нужно копировать


ОПИСАНИЕ


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


Копирование файлов из одной системы в другую с помощью uucp -

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

направить. Но как быть в случае, когда вам нужно скопировать иерархию

файлов? Как гарантировать, что файлы расположатся в системе-адресате

в виде иерархии, а не будут засунуты в один и тот же каталог?

Единственное предложение в документации по uucp (даже не на страницах

руководства) говорит о том, как это сделать. Если вы никогда не

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

Нам нужно инструментальное средство, которое передает

древовидные структуры в другие системы, сохраняя при этом форму этих

структур. Мы хотим обеспечить простой способ выполнения этой работы,

чтобы не искать каждый раз припрятанную информацию.


ЧТО ДЕЛАЕТ uutrans?


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

копирование файловых иерархий. Этот командный файл знает, какие файлы

передавать, в какую систему их направить и где их разместить в этой

системе.

Когда вы запускаете uutrans, первым делом он запрашивает

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

нажмите возврат каретки для выхода. Обратите внимание, что

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

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

передаваемых файлов. Например, если вашим текущим каталогом является

$HOME и вы хотите сделать его каталогом-источником, введите ".".

Оператор find сгенерирует для файла /src/f.c маршрутное имя

./src/f.c. Если же вы введете, например, имя /usr/russ, то

результирующим маршрутным именем будет /usr/russ/src/f.c. Таким

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

создания лишних уровней каталога в системе-адресате.

Затем запрашивается имя системы-адресата. Если вы хотите, чтобы

это была ваша собственная система, нажмите возврат каретки. Это

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

другие файловые системы.

В запросе каталога-адресата умолчанием является PUBDIR. Если вам

это не подходит, укажите точное маршрутное имя каталога, с которого

вы хотите начать иерархию в системе-адресате. (Напомним также, что

многие системы накладывают ограничения на то, куда вы можете

копировать файлы с помощью uucp.) Способ, которым uutrans

поддерживает правильное файловое дерево - это указание абсолютного

маршрутного имени в системе-адресате, ниже которого будут

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

- занести маршрутное имя в переменную и использовать ее в качестве

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

Когда вся входная информация введена, используется команда find,

чтобы найти все файлы, относящиеся к данной иерархии. Затем каждое

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

и передает файл адресату при помощи uucp.

Для того чтобы ускорить весь процесс и сэкономить свободное

пространство, файлы ставятся в очередь в каталоге подкачки (т.е. не

делается попытка вызвать удаленную систему), и никакие файлы не

копируются в каталог подкачки. Это экономит время, которое ушло бы на

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

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

числа файлов забирает все свободное пространство.

Когда все файлы поставлены в очередь, вам нужно вручную

подсоединиться к uucp с помощью команды 'c' или 'r' утилиты uust. Все

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

пересылки файлов.

Несколько неприятный вопрос - права собственности и доступа к

файлам на принимающей стороне. Обычная последовательность действий

такова:


1. Поставить файлы в очередь к uucp, используя инструментальное

средство uutrans.

2. Выйти из системы-источника.

3. Войти в систему-адресат.

4. Запустить uust и повторно подключиться к uucp.


Если вы придерживаетесь такой технологии постановки в очередь и

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

направляются. Имеется побочный эффект, заключающийся в том, что права

доступа к файлам в каталоге-адресате устанавливаются в соответствии с

маской интерпретатора shell (shell umask) того процесса, который

производит повторное подключение.

Необходимо отметить, что если у вас нет прав доступа на запись в

вашей umask, то создается пересылочный каталог, но в него не могут

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

uucp. Для разрешения этой проблемы измените вашу umask на "000" (по

умолчанию она равняется 777 для каталогов и 644 для обычных файлов).