BSD-система печати
Категория: Печать | Автор: admin | 17-06-2010, 06:10 | Просмотров: 3856

Система печати BSD была разработана специально для использования построчно-печатающих принтеров. К счастью, удачная "конструкция" этой системы позволяет легко приспосабливать ее для печати на большинстве современных принтеров. Сетевая часть системы печати BSD также хорошо масштабируется для использования в больших неоднородных сетях и позволяет многим компьютерам совместно использовать принтеры. Спулер печати lpd фактически стал стандартом де-факто и применяется во многих сетевых принтерах.

Из числа рассматриваемых в нашей книге систем Red Hat и FreeBSD используют систему печати BSD как основу для своего программного обеспечения печати.

 

Обзор процесса печати

 

В BSD-системе всем доступом к принтерам управляет демон lpd, который обычно находится в каталоге /usr/lib и запускается в процессе загрузки системы. Демон lpd отвечает за прием заданий на печать от пользователей и других (удаленных) демонов lpd, обрабатывает их и посылает на свободный принтер. Чтобы выполнить указанные действия, lpd считывает данные о конфигурации принтера из файла /etc/printcap — базы данных системы, содержащей информацию о принтерах.

Пользователи, для отправки своих заданий на печать демону lpd, пользуются услугами команды lpr. Эти два процесса взаимодействуют через сокет /dev/printer.

Рассмотрим процесс выбора принтера, на который необходимо послать задание печати. Если программе lpr передается аргумент принтер, то пунктом назначения становится принтер. В противном случае проверяется среда на предмет наличия переменной PRINTER. Если эта переменная определена, используется ее значение. Во всех остальных случаях задание передается на общесистемный принтер, заданный по умолчанию. Почти все команды, относящиеся к печати, включая lpq и lprm, понимают аргумент и переменную среды PRINTER.

Как только команда lpr узнает, на какой принтер направляется текущее задание, она начинает искать этот принтер в базе данных о принтерах системы (/etc/printcap). Из данного файла команда lpr получает имя каталога, в который следует помещать задания печати для указанного принтера. Этот "буферный каталог" обычно носит имя /var/spool/имя_принтера.

Для каждого задания команда lpr создает в буферном каталоге два файла. Имя первого состоит из букв cf (control file) и числа, идентифицирующего задание. Этот файл содержит справочную информацию и информацию об обработке задания, например сведения о пользователе, который его передал. Числовая часть имени файла может состоять максимум из трех цифр, поэтому при наличии в очереди более 999 заданий система печати начинает работать некорректно. Имя второго файла начинается с букв df (data file) и заканчивается тем же числом. Этот файл содержит данные, подлежащие печати. После его постановки в очередь команда lpr уведомляет демона lpd о существовании задания.

Получив это уведомление, демон lpd обращается к файлу printcap и выясняет местонахождение пункта назначения: локальный он или удаленный. Если в файле printcap указано, что принтер подключен локально, демон lpd проверяет наличие демона печати, обрабатывающего соответствующую очередь, и в случае отсутствия такового создает его (т.е. экземпляр самого себя).

Если соответствующий принтер подключен к другому компьютеру, демон lpd устанавливает соединение с демоном lpd удаленного компьютера и пересылает туда файл данных и управляющий файл. Затем демон lpd удаляет локальные копии этих файлов.

Планирование заданий печати осуществляется по алгоритму "первым пришел — первым обслужен" (FIFO), но системный администратор может при желании изменить порядок печати с помощью команды 1рс. К сожалению, нет возможности дать системе печати инструкцию о том, чтобы она все время отдавала предпочтение заданиям, направленным на печать тем или иным пользователем или компьютером.

Когда задание готово к печати, демон lpd создает ряд программных каналов между буферным файлом и печатающим устройством для передачи данных, подлежащих печати. Посередине этой цепочки демон lpd устанавливает процесс-фильтр, в задачи которого входит просмотр и, возможно, редактирование содержимого потока данных, прежде чем они поступят на принтер.

Процессы-фильтры могут выполнять над данными различные преобразования либо вообще ничего не делать. Основное их назначение — обеспечивать форматирование для специальных прикладных программ и поддерживать все зависящие от устройств протоколы, которые могут понадобиться для работы с данным принтером. В командной строке lpr можно назначить для принтера другой фильтр вместо заданного по умолчанию.

 

Управление средой печати

 

На практике для ежедневного сопровождения системы печати необходимо знать всего три команды: lpq, lprm и lpc. Команда lpq позволяет просматривать очередь заданий, ожидающих печати на конкретном принтере. Посредством команды lprm можно удалять одно или несколько из этих заданий (при этом стираются соответствующие файлы данных и из системы печати удаляются все ссылки на них). Обе эти команды доступны для пользователей, и обе работают в сети, не оказывая влияния на работу системы.

Команда lpc позволяет вносить изменения в среду печати: например, отключать принтеры и переупорядочивать очереди печати. Некоторые из ее функций доступны для пользователей, но в основном это средства администратора.

Таблица 23.1. Команды системы печати BSD

Команда

Местонахождение

Выполняемая функция

lpq

/usr/bin

Показывает содержимое и статус очереди на печать

lpr

usr/bin

Ставит задания в очередь на печать

lprm

/usr/bin

Ликвидирует очередь или отменяет задание на печать

lpc

/usr/sbin

Управляет принтером или очередью на печать

lpd

/usr/sbin

Включает в очередь и выводит на принтер задание на печать

lptest

/usr/bin

Создает тестовый ASCII-код

lpunlock

/usr/bin

Разблокирует "зависший" принтер (только в Rad Hat)

printtool

/usr/bin

Конфигурирует указанную систему печати (толы в Red Hat)

lptcontrol

/usr/sbin

Конфигурирует для печати параллельный порт (только во FreeBSD)

 

Демон lpd: BSD-спулер печати

 

Когда демон lpd приступает к своей работе, он считывает файл /etc/printcap, в котором содержатся данные о принтерах системы. Затем он начинает печать какого-нибудь задания, ожидающего этого момента в буферном каталоге, и принимается за считывание нового задания на печать.

Демон lpd, запущенный с флагом -l, регистрирует задания на печать в системе Syslog от имени средства "lpr". При отсутствии флага -l этот демон регистрирует только системные ошибки.

Управление доступом производится на каждом компьютере, система печати BSD не позволяет осуществлять контроль за конкретным удаленным пользователем. Только компьютеры, имена которых значатся в файлах /etc/hosts.equ или /etc/hosts.lpd, имеют возможность ставить задания в очередь на печать. Помните, что добавление имени какого-либо компьютера в файл /etc/hosts.equiv означает абсолютное "доверие" этому компьютеру. Мы рекомендуем всегда использовать файл /etc/hosts.lpd для контроля за доступом к принтеру. Если необходима более надежная модель защиты, рассмотрите возможность перехода к системе LPRng.

 

Команда lpr: выдача заданий на принтер

 

Единственная программа в системе BSD, которая может выстраивать подлежащие печати файлы в очередь, — это команда lpr. Все остальные программы, используемые для печати файлов (например, программы enscript и netscape), делают это, вызывая программу lpr.

В качестве аргументов команды lpr могут быть использованы несколько полезных опций. Флаг -#число позволяет напечатать количество копий, равное значению число, а флаг -h запрещает печать титульной страницы. Как напоминание о временах, когда принтеры печатали очень медленно, существует флаг -m, обеспечивающий уведомление пользователя о том, что его задание на печать выполнено, по электронной почте.

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

% lpr -Phowler-lw -#2 thesis

 

Команда lpq: просмотр очереди печати

 

Команда lpq обычно применяется с опцией , но можно использовать и другие аргументы командной строки, чтобы ограничить перечень просматриваемых заданий. Выходные данные команды lpq выглядят примерно так:

 

% lpq

anchor-lj is ready and printing

Rank       Owner       Job      Files            Total Size

active     garth       314      domain.2x1.ps    298778 bytes

1st        kingery     286      standard input    17691 bytes

2nd        evi          12      appendices          828 bytes

3rd        garth        13      proc              43229 bytes

4th        scott        14      periodic          16676 bytes

5th        garth        16      standard input      489 bytes

 

 

В первой колонке дается информация о том, в каком порядке будут распечатываться задания. Эти сведения в принципе не нужны, потому что выходные строки всегда расположены по порядку; активное задание указывается первым. Если первое задание обозначено как 1st, а не как active, это значит, что демон печати для принтера не запущен.

Во второй колонке дается имя пользователя, который послал задание на печать. В третьей — идентификационный номер задания; его необходимо знать, если впоследствии планируется обрабатывать это задание с помощью команд lprm или lрс. В четвертой колонке перечисляются указанные в командной строке lpr файлы, посылаемые на печать. Если данные для вывода на печать поступили по программному каналу (как, например, первое и пятое задания нашего примера), в этой графе будет стоять запись standard input. В пятой колонке указывается размер задания. Это значение соответствует размеру задания до его передачи в программу-фильтр и не дает информации о том, сколько страниц займет задание и как долго оно будет печататься.

 

Команда lprm: удаление заданий

 

Самая распространенная форма команды lprmlprm ид_задания, где ид_задания — идентификатор задания согласно выходным данным команды lpq. Команда lprm пользователь удаляет все задания, принадлежащие указанному пользователю. Команда lprm без аргументов удаляет активное задание. Если указать lprm -, то будут удалены все задания, переданные на печать; если данную команду задает пользователь root, удаляются все задания, стоящие в очереди. Обычный пользователь не может удалить задания другого пользователя, в то время как суперпользователь имеет право удалять любое задание.

Выходную информацию команда lprm выдает только в случае успешного выполнения, в противном случае она молча уходит со сцены. Если вы не увидели что-нибудь наподобие

 

dfA621xinet dequeued

cfA621xinet dequeued

 

 

это значит, что команда lprm вызвана неправильно.

Система печати регистрирует происхождение задания и имя пользователя, который послал его на печать, что учитывается соответствующим процессом lprm. Так, пользователь garth@boulder не эквивалентен garth@sigi, и ни один из них не может удалять задания другого.

Попытка удалить с помощью команды lprm активное задание может вызвать проблемы на некоторых принтерах (особенно на лазерных, где используется программное обеспечение TranScript фирмы Adobe). Процесс-фильтр задания надлежащим образом не уведомляется о прерывании, вследствие чего вся система со скрипом останавливается, а процесс-фильтр продолжает блокировать порт принтера, не давая использовать его другим процессам.

Единственный способ исправить положение заключается в определении номеров процессов-фильтров с помощью команды ps и уничтожении их вручную. Команда lpc в такой ситуации не годится. В принципе, при зависании демона lpd есть хорошее лекарство — перезагрузка системы, но это радикальная мера. Прежде чем перезагружать систему, можно еще попробовать уничтожить и перезапустить главный экземпляр демона lpd.

 

Команда lpc: внесение административных изменений

 

Команда lpc выполняет следующие функции:

  • включение и выключение режима постановки заданий в очередь на конкретный принтер;
  • включение и выключение печати на конкретном принтере;
  • удаление всех заданий из очереди принтера;
  • перенесение задания в начало очереди принтера;
  • управление демоном lpd;
  • получение информации о состоянии принтера.

Когда система печати работает гладко, команда lpc функционирует просто отлично. Стоит только "захлебнуться" фильтру или появиться другой незначительной проблеме, как команда lpc полностью "сходит с ума" и начинает, помимо всего прочего, просто врать: иногда она заявляет, что все исправлено, тогда как на деле она и пальцем не пошевелила. Приходится устранять проблемы вручную и даже отключать и включать питание оборудования, если печать идет уж очень плохо.

Команду lрс нельзя использовать в сети; нужно зарегистрироваться на компьютере, к которому подключен манипулируемый принтер. Обычно команда работает в диалоговом режиме, хотя возможен и разовый вызов путем включения интерактивной директивы в командную строку lрс. В среде lрс допустимо применение следующих директив.

help [команда]

 

Если директива help указывается без аргументов, то выдается краткий перечень всех команд, которые можно использовать в среде lрс. При наличии аргумента выдается однострочное описание конкретной команды.

 

enable принтер

disable принтер

 

 

Эти команды служат для включения и выключения режима организации очереди заданий к указанному принтеру. Если постановка задания в очередь невозможна, пользователю вежливо сообщат об этом. Указанные операции выполняются посредством установки или сброса соответствующего бита кода прав доступа /var/spool/принтер/lock для группы.

 

start принтер

stop принтер

 

 

Директива start включает, а директива stop — выключает печать на указанном принтере. После выключения печати на принтере постановка заданий в очередь продолжается, однако вывод их на печать приостанавливается до тех пор, пока печать не будет запущена вновь. Эти операции выполняются посредством установки или сброса бита выполнения для владельца файла /var/spool/принтер/lock. Кроме того, указанные директивы уничтожают и запускают соответствующие демоны для принтера. Получив директиву stop, система печати сначала завершает активное задание и только после этого выключает печать.

 

abort принтер
 

 

Директива abort работает так же, как stop, но при этом не завершается активное задание. После возобновления печати задание будет печататься с самого начала.

 

down принтер сообщение

up принтер

 

 

Эти директивы влияют и на организацию очереди, и на печать. Они используются в случае серьезной поломки принтера и необходимости отключения его на длительный период времени. Параметр сообщение в директиве down может иметь произвольную длину (в пределах одной строки) и не должен заключаться в кавычки. Это сообщение помещается в файл /var/spool/принтер/status принтера и выдается всем пользователям, которые запускают команду lpq. Как правило, сообщение содержит краткое разъяснение причины выхода принтера из строя и информацию о том, когда он вновь начнет работать. Действие директивы up обратно действию директивы down.

 

clean принтер
 

 

Эта директива удаляет из очереди к принтеру все задания, включая активное. Поскольку демон печати для данной очереди все равно будет содержать ссылки на файлы текущего задания, то оно будет завершено.

 

topq принтер ид_задания

topq принтер имя_пользователя

 

 

Первая директива topq перемещает в начало очереди печати указанное задание, а вторая — все задания, принадлежащие пользователю имя пользователя.

 

restart принтер
 

 

Данная директива используется для перезапуска демона печати, который таинственным образом "скончался". О том, что демон "мертв", можно узнать, когда команда lpq сообщит: "No daemon present". На первый взгляд может показаться, что действие директивы restart аналогично действию последовательности директив stop/start, однако это не так: если продолжает работать фильтр принтера, то с помощью директивы restart перезапустить принтер нельзя.

 

status принтер
 

 

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

 

lpc> status car

cer:

   queuing is enabled

   printing is enabled

   no entries

   no daemon present

 

 

Факт отсутствия демона сам по себе не является причиной для беспокойства; если очередь пуста, демон принтера "исчезает" и запускается вновь главным экземпляром демона lpd только при постановке в очередь нового задания.

 

Файл /etc/printcap

 

Файл /etc/printcap является основной базой данных BSD-системы печати. На принтер можно передавать задания только в том случае, если он описан в этом файле.

Для файла /etc/printcap используется тот же формат, что и для файлов /etc/termcap и /etc/remote. Каждый элемент начинается со списка имен принтера, разделенных вертикальной чертой (|). Затем следует ряд параметров конфигурации, разделенных двоеточиями. Каждый параметр имеет вид хх=строка или хх#число, где хx — двухсимвольное имя параметра, а строка и число — присваиваемые ему значения. Если никакого значения не присваивается, значит, переменная является булевой и ее присутствие означает "истина".

Допускаются пустые операторы: два двоеточия, стоящих рядом. Рекомендуется начинать и заканчивать каждую строку двоеточием, чтобы впоследствии легче было вносить изменения. Комментарии в файле /etc/printcap должны начинаться со знака решетки (#). Элемент может состоять из нескольких строк, причем строки, за которыми следуют строки продолжения, должны заканчиваться обратной косой чертой. Строки продолжения в целях повышения наглядности текста программы обычно размещаются с некоторым сдвигом по отношению к первой позиции.

В качестве иллюстрации к описанию синтаксиса файла /etc/printcap дадим небольшой пример. Более полный пример приведен ниже, после описания переменных файла printcap.

 

# HP LaserJet 5М remote printcap. CS Department.

 

anchor-1jIcer11-56 I LaserJet 5M in cer lab:

   :lp=/var/spool/lpd/anchor-lj/. null:

   :sd=/var/spool/lpd/anchor-lj:

   :lf=/var/adm/lpd-errs:

   :rw:mx#0:rm=anchor:rp=anchor-lj:

 

 

Из первой строки видно, что cer, anchor-1 j, 1-56 и LaserJet 5M in cer lab — это эквивалентные имена одного принтера. Данные имена представляют собой хорошо известные сокращения, номер комнаты, в которой находится принтер, и его полное название. Принтерам можно присваивать сколько угодно имен, но обязательно следует указывать минимум три формы основного имени:

  • сокращенную (три-четыре символа, которые удобно вводить, например cer);
  • полную (имя компьютера и тип принтера, например anchor-lj);
  • описательную (прочая информация, например LW Plus in cer lab).

Следующие две строки нашего примера содержат установки конфигурации для устройства с указанным именем (lp), каталога спулинга (sd) и журнального файла (lf). Последняя строка определяет параметры соединения с принтером, в ходе которого осуществляется запись-считывание (rw), максимальный размер файла (mx, в данном случае размер не ограничен), имя удаленного компьютера (rm) и имя удаленного принтера (rp).

Задания, переданные в систему печати без конкретного пункта назначения, направляются на первый принтер, среди указанных имен которого есть "lp" . Имя "1р" нельзя использовать в качестве основного имени принтера, поскольку замена стандартного принтера в этом случае будет затруднена.

 

Переменные базы данных printcap

 

Высокие "адаптационные способности" системы печати BSD в значительной степени обусловлены особенностями файла printcap. Переменные базы данных printcap описаны на соответствующей man-странице руководства, а здесь мы рассмотрим лишь наиболее часто используемые переменные. Они приведены в табл. 23.2.

Все элементы записи printcap должны обязательно включать абсолютные имена буферного каталога (sd), журнального файла ошибок (lf) и устройства печати (1р). Если у вас современный принтер, то следует указать, что этот принтер открыт для записи и чтения (rw), чтобы он мог посылать сообщения о своем статусе и ошибках компьютеру.

Таблица 23.2. Часто используемые переменные программы printcap

Переменная

Тип

Назначение

Пример

sd

строка

Каталог спулинга

sd=/var/spool/lpd/howler-lw

if

строка

Журнальный файл ошибок

lf=/var/log/lpr

строка

Имя устройства

lp=/dev/lp0

af

строка

Файл учетных записей

af=/usr/adm/lpr.acct

rm

строка

Имя удаленного компьютера

rm=beast.xor.com

rp

строка

Имя удаленного принтера

rp=howler-lw

of

строка

Выходной фильтр

of=/usr/libexec/lpr/lpf

if

строка

Входной фильтр

if=/usr/sbin/stylascii

mx

число

Максимально-допустимый объем файла

mx#0

sh

булево значение

Отмена печати заголовков

sh

 

Переменная sd: буферный каталог

 

У каждого принтера должен быть свой буферный каталог. Все буферные каталоги должны находиться в одном родительском каталоге (обычно это /var/spool) и иметь имена, совпадающие с полными именами обслуживаемых ими принтеров (в нашем примере anchor-lj). Буферный каталог необходим даже в том случае, если описываемый принтер подключен к другому компьютеру; задания находятся на локальном компьютере до тех пор, пока они не будут переданы на печать.

При инсталляции нового принтера необходимо создать буферный каталог вручную и назначить ему код прав доступа 775. И в качестве владельца, и в качестве группы для этого каталога должен быть указан пользователь daemon.

Буферный каталог для принтера включает также два статусных файла: lock и status. Файл status содержит однострочное описание состояния принтера. Эту строку формирует демон lpd и использует команда lpq. Назначение файла lock заключается в том, чтобы избежать активизации нескольких экземпляров демона lpd в одной очереди, кроме того, в нем хранится информация об активном задании. Программа lpc в процессе управления спулингом и печатью на принтере изменяет код прав доступа к файлу lock.

 

Переменная lf: журнальный файл

 

Ошибки, сообщения о которых присылаются фильтрами печати, регистрируются в файле, указанном в данной переменной. Один журнальный файл ошибок может коллективно использоваться всеми принтерами и размещаться где угодно. При создании записи этого файла указывается имя принтера-"нарушителя". В приведенном выше примере журнальный файл — /var/adm/lpd-errs. Журнальные файлы должны быть даже для удаленных принтеров — а вдруг возникнет проблема, касающаяся связи с удаленным компьютером?

 

Имейте в виду, что демон lpd посылает сообщения об ошибках в систему Syslog. Некоторые фильтры также направляют свои сообщения об ошибках в систему Syslog, никак не регистрируя их в определенном в базе данных printcap журнальном файле. При возникновении проблем нужно проверять оба названных файла.

 

Переменная lр: имя устройства

 

Параметр имя_устройства должен задаваться только для локального принтера. Для локального принтера, подключенного через последовательный, параллельный или SCSI-порт, это файл в каталоге /dev, с помощью которого происходит обращение к данному принтеру. Если в базе данных printcap указан сетевой принтер (т.е. принтер в сети, а не просто "удаленный"), то в переменной lр должен быть задан фиктивный (dummy) файл (важен факт существования этого файла, но в качестве файла устройства он не применяется).

Программа lpd использует данные файла блокировки, соответствующего указанному в переменной lр устройству, чтобы определить, используется принтер или нет. Даже если доступ к принтеру осуществляется по сетевому соединению, переменная 1р обязательно должна быть задана. Необходимо указать уникальный файл, который существует и расположен на локальном диске.

 

Переменная rw: режим открытия устройства

 

Если принтер может посылать информацию о своем состоянии компьютеру через свой файл устройства, то необходимо, чтобы была определена булева переменная (rw), потому что это устройство должно быть открыто как для записи, так и для чтения. Режим чтения-записи полезен, поскольку позволяет сообщать данные об учетной записи и статусе, поэтому некоторые фильтры требуют установления такого режима.

 

Переменная af: учетный файл

 

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

Для обработки учетной информации используется команда pac. Обычно учетный файл данных принтера называется /var/adm/принтер-acct. В этот файл записывается количество страниц, напечатанных по каждому заданию (обычно не соответствующее действительности), имя компьютера, с которого было запущено задание, и имя владельца задания.

Одной из обязанностей входного фильтра принтера является генерация учетных записей. При использовании PostScript-принтеров вообще не стоит доверять счетчику страниц, если только фильтр не запрашивает показания счетчика страниц до и после печати.

 

Переменная mx: предельные размеры файлов

 

Переменная mx используется для задания предельного размера файла, посылаемого на печать. Однако для большинства принтеров (кроме построчно-печатающих) задавать эту величину бессмысленно. При печати небольших PostScript- и PCL-файлов могут быть выданы сотни никому не нужных страниц. Это несоответствие между размером файла и количеством страниц хорошо выявляется на практике, когда студенты пытаются печатать скомпилированные версии двоичных файлов, содержащих разработанные ими программы. Если все пользователи обладают достаточной квалификацией, не стоит обращаться к этому средству. У некоторых пользователей имеются вполне законные причины для печати больших файлов.

В некоторых системах значение переменной mx, устанавливаемое по умолчанию, отлично от нуля (0 означает отсутствие ограничений), и для того, чтобы иметь возможность выводить на печать большие задания, необходимо явно указать mx#0). Отметим, что переменная mx является числовой, поэтому нельзя указывать mx=0.

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

 

Переменные rm и rp: удаленный доступ

 

В большинстве случаев к принтеру нужно обращаться не с одного, а с нескольких компьютеров сети. Даже если принтер — сетевое устройство, следует выбрать один компьютер и назначить его ответственным за связь с принтером. Все остальные машины должны пересылать задания на этот компьютер. Это позволяет демону lpd создавать единую очередь заданий, что исключает случаи конфликтов между компьютерами за право управления принтером. Кроме того, если печать не работает, вы будете знать, где искать причину.

В файле printcap "удаленного" компьютера (компьютера, не имеющего непосредственного соединения с принтером) присутствует группа из двух переменных, где указывается, куда посылать задание (как в примере, рассмотренном выше). В переменной rm определяется компьютер, на который должны направляться задания, а переменной rp задается имя принтера на этом компьютере. Ниже процесс удаленной печати рассмотрен более подробно и проиллюстрирован на конкретных примерах.

На первый взгляд, файл /etc/printcap — сущий кошмар для администратора, потому что элементы, в которых описывается локальный принтер, отличаются от элементов, где описывается принтер удаленный. Выход из этой ситуации может быть следующим: нужно сделать имена для принтеров разными на локальном и удаленном компьютерах, например howler-lw-local и howler-lw. Такая конфигурация делает принтер howler-lw "удаленным" даже для того компьютера, к которому он подключен, но, тем не менее, все отлично работает. Однако если вы хотите использовать команду lрс, следует обращаться к принтеру howler-lw-local.

 

Переменные of, if, nf: фильтры печати

 

Фильтры выполняют целый ряд функций. Фильтр печати, заданный по умолчанию (обычно это /usr/lib/lpf), производит обработку управляющих символов в подлежащем печати тексте и, если требуется, генерирует учетную запись. На заре эпохи UNIX на фильтры часто возлагались обязанности по выполнению различных функций форматирования, но сейчас эта практика уже не так распространена, как раньше. Единственные специальные фильтры, с которыми вам, возможно, придется иметь дело, — это фильтры для обработки выходной информации программы troff, выходной информации системы ТеХ и дампов экрана.

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

Фильтры — это, как правило, просто сценарии shell, которые вызывают ряд конвертирующих программ. Программа-фильтр должна принимать задание печати со стандартного ввода, конвертировать это задание в формат, поддерживаемый данным устройством, и посылать результат на стандартный вывод.

Если при выполнении программы lpr пользователь не указал фильтр, то будет использоваться либо входной фильтр, либо выходной. Эти имена нельзя назвать удачными, ибо оба фильтра на самом деле служат для посылки данных принтеру.

Когда в файле /etc/printcap присутствует переменная if, но нет переменной of, устройство будет открываться один раз для каждого задания, а фильтр будет посылать одно задание на принтер и завершать работу.

Если есть выходной фильтр, но нет входного, то демон lpd однократно откроет устройство и вызовет программу-фильтр для посылки сразу всех заданий, стоящих в очереди. Это средство полезно для тех устройств, установление соединения с которыми занимает много времени; но такие, однако, встречаются редко.

При наличии в файле /etc/printcap переменных if и of выходной фильтр будет использован для передачи страницы заголовка (и будет вызван даже в том случае, если печать заголовков отключена), а входной будет вызван для передачи задания. Такая комбинация слишком сложна для простых смертных, поэтому лучше ее избегать.

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

Входные фильтры вызываются с многочисленными аргументами, которые в каждой реализации свои. Наиболее заслуживающие внимания из них — имя пользователя, имя компьютера и имя учетного файла. Если вы желаете организовать учет работы принтера, входной фильтр должен генерировать учетные записи и добавлять их к учетному файлу. Если необходимо ограничить доступ к принтеру (например, запретить доступ пользователю guest на всех компьютерах), то эту обязанность тоже нужно возложить на входной фильтр, поскольку у демона lpd нет встроенных средств ограничения доступа отдельных пользователей к системе печати.

Чтобы проиллюстрировать использование фильтров, рассмотрим очень простой пример с входным фильтром. Этот пример — для PostScript-принтера, подключенного через последовательный порт к локальному компьютеру:

 

#!/bin/csh -f

/usr/local/bin/textps $*  |  /usr/local/bin/psreverse

 

 

Поскольку принтер подключен последовательно, демон lpd открывает это устройство с соответствующими режимами согласно указаниям в файле /etc/printcap. Первой вызывается программа textps, которая анализирует входные данные и определяет их формат. Если это не формат PostScript (который поддерживает наш принтер), данные конвертируются в этот формат. Указанная программа берет все переданные ей аргументы фильтра ($*) и на основе данной информации должна генерировать учетные записи. Вторая программа, psreverse, изменяет порядок следования страниц на обратный, чтобы они выходили в соответствующей последовательности.

 

Переменные базы данных printcap для последовательных устройств

 

Следующие несколько переменных полезны только для локальных принтеров, подключаемых к последовательному порту. Если вы устанавливаете сетевой принтер, остальную часть этого параграфа можете не читать. Вместо этого откройте инструкцию, найдите спецификации, касающиеся линии связи, и изучите их.

С помощью переменных файла printcap можно контролировать параметры связи трех типов: скорость в бодах, биты установки флагов и биты локального режима.

 

Переменная br: скорость передачи в бодах

 

Если принтер подключен к последовательному порту, понадобится переменная br. Последовательный принтер ничем не отличается от других аппаратных средств: для нормального функционирования следует согласовать набор коммуникационных параметров, определяющих взаимодействие принтера и компьютера, в частности скорость передачи, четность и логику управления потоками. Конфигурация принтера имеет много общего с конфигурацией терминала. Обзор последовательных устройств и кабельных систем приведен в главе 7.

В файле printcap можно задавать три параметра: скорость передачи в бодах, биты флагов и биты локального режима. Скорость передачи в бодах — целое число. Поскольку это числовое значение, для его установки используется знак решетки (#). Например, br#9600 устанавливает скорость передачи 9600 бит/с.

 

Переменные fc и fs: биты флагов

 

Значения битов флагов и битов локального режима (см. ниже) — тоже целые числа, но установкой каждого бита такого числа задается конкретный параметр порта. Для правильной установки этих параметров необходимо найти описание значений каждого бита на man-странице, посвященной драйверу tty (раздел 4, а не 1) и определить, значения каких битов следует установить или сбросить. Значения надлежит корректировать только на том компьютере, к которому подключен принтер.

Существуют две переменные, которые можно использовать для корректировки битов флагов: fc и fs. Переменная fc (flag clear — сброс флага) задает биты, которые нужно выключить, a fs (flag set — установка флага) — биты, которые нужно включить. Биты, не указанные ни в одной из этих переменных, принимают значения, заданные по умолчанию. Одновременно устанавливать и сбрасывать бит бессмысленно (но развлечения ради можно попробовать).

Подробно назначение каждого бита флагов описано на man-странице драйвера tty.

 

Переменные xs и хс: биты локального режима

 

Биты локального режима полезны только для построчно-печатающих принтеров, подключаемых к последовательному порту. Переменные хс и xs убирают и устанавливают индивидуальные биты режима во многом аналогично тому, как переменные fc и fs убирают и устанавливают биты флагов.

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

 

Расширения базы данных printcap

 

У связки программ lpr/lpd есть одна прекрасная особенность: они не обращают внимания на нестандартные переменные printcap. Во многих случаях, когда принтеру нужно больше информации о конфигурации, чем имеется в базовой системе, можно определять в файле printcap дополнительные переменные, которые будут использоваться фильтрами принтера.

Например, для выходного фильтра сетевого принтера требуется сетевое имя этого устройства. В элемент файла printcap для этого принтера можно добавить следующую запись:

:nn=laser.colorado.edu:

 

Использование такого рода расширений позволяет хранить всю информацию о конфигурации принтера в одном, удобном для вас месте. Если вы вдруг увидите в файле printcap переменные, не упомянутые на man-странице, поищите их значения в документации на драйверы принтера.

В нашей сети документируется физическое местоположение каждого принтера. Наши принтеры имеют записи типа

:lo=Room 423, Engineering building:

 

Мы используем сценарии, которые отслеживают наличие бумаги и запас тонера в этих принтерах и при необходимости посылают в группу технического обслуживания сообщения типа "Добавьте бумагу в принтер, находящийся в комнате 423 Инженерного корпуса". За более подробной информацией о мониторинге сетевых устройств обратитесь к главе 20.

 

Печать не на принтеры

 

Недавно мы рассматривали случай "творческого неправильного использования", о котором сообщил Шон Маккрири (Sean McCreary), когда система печати BSD применялась для загрузки в буфер музыкальных файлов в формате МРЗ, в результате чего получался своеобразный музыкальный автомат. Оставляя в стороне этическую сторону дела, можно сказать, что это — прекрасная характеристика гибкости системы печати.

Запись в файле printcap выглядит примерно так:

 

mp3-local:

   :sd=/var/spool/lpd/mp3-local:

   :lf=/var/log/lpd-errs:

   :if=/usr/local/lib/mp3-play:

   :lp=/dev/null:

   :mx#0:

 

 

Настоящий МР3-плейер, amp, по умолчанию не читает данные из потока stdin, поэтому сценарий, состоящий из одной строки, называемый mp3-play, связывает его с системой печати:

 

#!/bin/sh

exec /usr/local/bin/amp -

 



 (голосов: 1)
Версия для печати | Комментариев: 0
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии в данной новости.


 
Логин
Пароль
 

 
Locations of visitors to this page