Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

7.12. Настройка сервиса принтера

7.12.1. Как LP обрабатывает файл запроса.
7.12.2. Настройка характеристик порта принтера
7.12.3. Настройка базы данных Terminfo
7.12.4. Как написать программу интерфейса

7.12.5. Как использовать программу интерфейса
7.12.6. Настройка программы интерфейса

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

Вы можете оосуществить настройку LP несколькими способами. В этом подразделе рассказывается как вы можете:

  • настроить характеристики портов принтеров;
  • настроить базу данных Terminfo;
  • написать программу интерфейса.

7.12.1. Как LP обрабатывает файл запроса

Каждый запрос отсылается в spooling daemon, который следит за всеми запросами. Следящий процесс (демон) создается, когда вы запускаете сервис принтера LP. Этот процесс системы UNIX также отвечает за слежением за состоянием принтеров и медленных фильтров; когда принтер заканчивает распечатку файла пользователя, демон запустит на нем распечатку другого запроса, если он есть в очереди.

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

  1. Для большей части принтеров вам нужно изменить конфигурацию, хранящуюся на диске. Некоторые из наиболее зависимых от конфигурации принтера данные - это характеристики порта принтера: скорость передачи, контроль четности и т.д.
  2. Для принтеров, которые не представлены в базе данных Terminfo, вы можете добавить новый элемент, который описывает возможности принтера. Эта база данных позволяет: просматривать запросы, чтобы гарантировать, что те, которые приняты к распечатке могут быть обработаны требуемым принтером; устанавливать принтеры в состояние, когда у него будет готовность распечатать запрос. Например, если база данных Terminfo показывает, что принтер не в состоянии установить длину страницы, запрошенную пользователем, следящий процесс отвергнет этот запрос. С другой стороны, если она показывает, что принтер может это сделать, то та же самая информация будет использована программой интерфейса для инициации принтера.
  3. Для особенно трудных в работе принтеров или когда вы хотите добавить средства, не обеспеченные поставленным сервисом LP, вы можете изменить стандартную программу интерфейса. Эта программа отвечает за управление принтером: она распечатывает заглавную страницу, инициирует принтер, а также вызывает фильтр для отсылки копий файлов пользователя на принтер.
  4. Чтобы обеспечить связь прикладных программ, используемых в вашей системе, и принтеров, вы можете добавить быстрые и медленные фильтры. Каждый тип фильтра может преобразовывать один набор последовательности переключения кода в другой, а также может обеспечить специальную установку, прервав режимы распечатки, запрошенные пользователем. Медленные фильтры функционируют отдельно с помощью демона, чтобы избежать ограничения принтера. Быстрые фильтры функционируют так, что их вывод идет прямо на принтер, таким образом, они могут управлять работой принтера.

7.12.2. Настройка характеристик порта принтера

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

Когда вы добавляете новый принтер, прочтите документацию к нему, чтобы иметь представление о том, что он ожидает от главной машины. Затем изучите команду stty. Она сводит воедино различные характеристики, которые невозможно установить на терминале или в порт принтера.

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

Таблица 2

Параметр stty Значение
evenp Отсылает проверку на четность в 8-м разряде
oddp Отсылает проверку на нечетность в 8-м разряде
-parity Не формирует разряда четности, посылает все 8 разрядов без изменений
110 - 38400 Устанавливает скорость в линии передачи на эту скорость передачи
ixon Разрешает управление потоками XON/XOFF (также известное как START/STOP или DC1/DC3)
-ixon Отключает управление потоками XON/XOFF
-opost Не выполняет "постобработку вывода"
opost Выполняет "постобработку вывода" согласно установкам
onclr Вставляет символ "возврат каретки" перед любым символом "перевод строки"
-onclr Не вставляет символ "возврат каретки"
ocrnl Изменяет символ "возврат каретки" на символ "перевод строки"
-ocrnl Не изменяет символ "возврат каретки" на символ "перевод строки"
-tabs Заменяет метки табуляции на эквивалентное число пробелов
tabs Не заменяет метки табуляции на пробелы

7.12.3. Настройка базы данных Terminfo

LP полагается на страндартный интерфейс и базу данных Terminfo при иницииации каждого принтера и установке выбранного размера страницы, шага расположения символов, шага строки и набора символов. Обычно бывает достаточно сделать правильный ввод элементов в базу данных Terminfo, чтобы добавить новый элемент к LP . Несколько элементов принтеров AT&T поставляются вместе с элементами Treminfo в пакете LP.

Каждый принтер идентифицируется в базе данных Terminfo по короткому имени; этот вид имени идентичен тому, которое используется для установки пременной командного файла TERM. Например, принтер AT&T модель 455 идентифицируется по имени 455.

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

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

Таблица 3

Элемент Terminfo Значение
daisy Принтеру нужен оператор, чтобы изменить набор символов
bufsz Число байтов, помещаемых в буфер перед распечаткой
* cols Число колонок в строке
* it Метки табуляции, используемые вместо пробелов
* lines Число строк на странице
orc Разрешающая способность по горизонтали в единицах на символ
orchi Разрешающая способность по горизонтали в единицах на дюйм
orl Разрешающая способность по вертикали в единицах на символ
orvi Разрешающая способность по вертикали в единицах на дюйм
cps Средняя скорость распечатки в символах
* cr Возврат каретки
cpi Изменение числа символов на дюйм
lpi Изменение числа строк на дюйм
chr Изменение разрешающей способности по горизонтали
cvr Изменение разрешающей способности по вертикали
csnm Список имен набора символов
mgс Очистка всех полей (верхних, нижних и боковых)
* hpa Абсолютная позиция по горизонтали
* cud1 На одну строку вниз
* cuf1 Каретку вправо
swidm Разрешение печати удвоенной ширины
rwidm Запрещение печати удвоенной ширины
* ff Выдача страницы
* is1 Строка инициации принтера
* is2 Строка инициации принтера
* is3 Строка инициации принтера
* if Имя файла инициации
* iprog Полное имя программы инициации
* cud Перемещение кареткии на # строки вниз
* cuf Перемещение кареткии на # строки вправо
* rep Повтор символа # раз
* vpa Абсолютная позиция по вертикали
scs Выбор набора символов
smgb Установка нижних полей на текущей строке
smgbp Установка нижних полей
smgl Установка левых полей в текущей колонке
smglp Установка полей слева
smgr Установка правых полей в текущей колонке
smgrp Установка полей справа
smgt Установка верхних полей на текущей строке
smgtp Установка верхних полей
scsd Запуск определения набора символов
* ht Метка табуляции для следующих 8 пробелов

Те элементы, которые помечены звездочкой (*), имеются во всех версиях UNIX System V. Остальные можно добавить только, если вы используете систему UNIX System V версии 3.2 или более поздние.

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

	tic filename

где filename - это имя файла, содержащего элемент Terminfo для нового принтера.

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

7.12.4. Как написать программу интерфейса

Если у вас есть требования к печати, которые не поддерживаются стандартной программой интерфейса, вы можете создать свою собственную программу интерфейса, взяв стандартную программу и настроив ее в соответствии со своими требованиями. Копия программы находится в файле: /usr/lib/lp/model/standard

7.12.4.1. Что делает программа интерфейса

Любая программа интерфейса выполняет следующие действия:

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

Программа интерфейса отвечает за открытие порта принтера. Это выполняется с помощью LP, который носит название коммутируемого принтера, если так устанавливается линия связи с принтером. Соединение порта принтера задается программе интерфейса как стандартный вывод, и принтер устанавливается как управляющий терминал для программы интерфейса и тогда "зависание" порта даст сигнал SIGHUP, который должен отсылаться в программу интерфейса. Настроенная программа интерфейса не должна прекращать инициацию принтера, что позволяет LP использовать программу интерфейса только для подготовки принтера или порта принтера, а распечатка выполняется как-нибудь иначе.

7.12.5. Как использовать программу интерфейса

Программа интерфейса вызывается следующим образом:

	/usr/sbin/lp/admins/lp/interface/P id user title copies \
	options file1 file2 ...

где P - имя принтера;
id - идентификатор запроса, взвращаемый LP;
user - регистрационный номер пользователя, делающего запрос;
title - необязательный заголовок, указываемый пользователем;
copies - количество запрошенных копий;
options - список параметров;
file - полное имя распечатываемого файла.

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

Параметр options cтандартной программы интерфейса может принимать следующий значения:

nobanner -
используется, чтобыпропуститьзаглавнную страницу;
nofilebreak -
используется, чтобы пропустить прерывание страницы между отдельнными файлами данных;
lpi=decimal-number2 -
устанавливают параметры распечатки: "decimal-number1" колонок на дюйм и "decimal-number2" строк на дюйм соответственно. Слова pica, elite и compressed являются приемлемыми заменами decimal-number1 и означают 10 колонок на дюйм, 12 колонок на дюйм и максимально возможное число колонок на дюйм соответственно;
width=decimal-number2 -
устанавливают соответственно длину и ширину страниц для распечатки;
'stty-option-list' -
используется для изменения конфигурации порта, которая устанавливается по умолчанию.

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

TERM=printer-type -
указывает тип принтера. Это значение используется для получения информации о возможностях принтера из базы данной Terminfo;
FILTER='pipeline' -
указывает фильтр, используемый для отсылки содержимого запроса на принтер;
CHARSET=character-set -
указывает набор символов, используемый при распечатке содержимого запроса.

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

7.12.6. Настройка программы интерфейса

Вы хотите убедиться, что настроенная программа интерфейса устанавливает требуемые режимы stty (характеристики терминала, такие как скорость передачи или параметры вывода). Стандартная программа интерфейса делает это, и вы можете последовать этому примеру. Найдите часть, которая начинается с комментария командного файла:

	## Initialize the printer port

Выполняйте код, используемый стандартной программой интерфейса. Он устанавливает как режимы по умолчанию, так и настраиваемые режимы, задаваемые с помощью LP или пользователем строкой следующего вида:

	stty mode options 0<&1

Эта командная строка обрабатывает стандартный ввод для команды stty из порта принтера. Пример строки команды stty, которая устанавливает скорость передачи на 1200 и устанавливает некоторые необязательные режимы:

	stty -parenb -parodd 1200 cs8 cread clocal ixon 0<&1

Одна из характеристик, не устанавливаемая стандартной программой интерфейса - управление потоками аппаратных средств. Способ ее установки будет различен в зависимости от аппаратных средств вашего компьютера. Найдите часть, которая начинается с комментария командного файла:

	# Here you may want to add other port
	# initialization code

Вследствии того, что различные принтеры имеют разное число колонок, убедитесь, что заголовок и концевик для вашей программы интерфейса соответствуют вашему принтеру. Стандартная программа интерфейса распечатывает заглавную страницу, которая сооветствует 80-колоночной странице (за исключением "шапки" пользователя, которая может быть длиннее). Найдите часть в тексте стандартной программы интерфейса, которая начинается с комментария:

	## Print the banner page

Некоторые прикладные приложения программы, функционирующие с конкретными принтерами, могут потребовать отключения прерывания страницы. Если вы должны отключить прерывание страницы, вы можете модифицировать стандартную программу интерфейса (/usr/lib/lp/model/standard) на строке 192, изменив "no" на "yes".

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

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

Код Значение для LP
0 Запрос выполнен успешно. Если был сбой принтера, он утранен
1 до 127 Возникла проблема с распечаткой этого конкретного запроса (например, слишком много нераспечатываемых символов или запрос превышает возможности принтера). Эта проблема не повлияет на будущие запросы. LP уведомляет того, кто выдал этот запрос, при его распечатке. Если возник сбой принтера, он устранен
128 Зарезервирован для внутреннего использования севисом LP
129 При распечатке запроса возник сбой принтера. Это повлияет на будущие запросы. Если механизм восстановления после сбоя даст указание LP подождать решения проблемы администратором, он запретит использование принтера
более 129 Зарезервировано для внутреннего использования сервисом LP

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

Сообщения о сбоях можно отослать LP с помощью программы lp.tell. Для обращения к этой программе в стандартной программе интерфейса используется переменная командного файла $LPTELL. Программа обрабатывает свой стандартный ввод и отсылает его LP, где он помещается в сообщение, предупреждающее администратора о сбое принтера. Если стандартный ввод пуст, lp.tell не инициирует предупреждение. Проверьте код стандартной программы интерфейса после комментариев:

	# Here's where we set up the $LPTELL programm
	# to capture fault messages.
	# Here's where we print the file.

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

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

Назад | Содержание | Вперед