/sys/doc/ Documentation archive

Руководство по спулеру печати Lp

Пол Глик
pg@plan9.bell-labs.com

АБСТРАКТНО

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

1. Введение

Lp используется для форматирования и печати данных на разных устройствах вывода. Необходимость в lp появилась в результате невозможности других спулеров печати выполнять простые задания без указания пользователем специальных опций. На момент создания lp существовало всего лишь несколько языков печати, а точнее ImPress и PostScript, и непосредственно разработанный принтер для работы с выводом troff. Сейчас все наши принтеры работают с форматом PostScript, но принтеры, использующие HPCL и HPGL, изобилуют и их поддержка может быть легко добавлена. В основе lp лежат спулеры BSD lpr и System V lp. Важная характеристика системы заключается в том, что большинство программ являются легко модифицируемыми сценариями оболочки и пользователю не обязательно изучать огромный багаж программного обеспечения, лежащего в основе системы. Lp работает как в Plan 9, так в и нескольких Unix-подобных системах. В данном документе описывается lp, имеющий отношение сугубо к Plan 9. Исконно для передачи данных между машинами использовались сети Datakit и Ethernet, сейчас же остался лишь один транспортный механизм Ethernet.

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

Все сценарии оболочки (см. rc(1)), ассоциированные с lp, находятся в каталоге спулинга /sys/lib/lp, но кроме самой команды lp, — она находится в /rc/bin. Команды, связанные с lp, которые не являются сценариями оболочки, могут быть найдены в /$cputype/bin/aux. Каталог, содержащий все сценарии lp, определен в переменной окружения LPLIB. В остальной части этого документа имена файлов будут определяться с использованием именно этой переменной оболочки.

2. Использование

Перед обработкой ввода lp требует обязательного указания устройства вывода. Это можно сделать одним из трех способов:

  1. Файл $LPLIB/defdevice должен содержать имя устройства вывода по-умолчанию. Этот вариант не практичен в системах с несколькими принтерами.
  2. Имя устройства можно явно указать в переменной окружения LPDEST. Этот вариант является более практичным решением в системах с несколькими принтерами. При выборе этого способа происходит автоматическое аннулирование спецификации defdevice.
  3. Опция -d принтер команды lp определяет принтер как устройство, на которое будет направляться весь вывод. В этом случае происходит аннулирование предыдущих двух спецификаций.

Если принтер имеет значение ?, то будет выведен список принтеров и другая информация из файла devices, как это показано на Рис. 1. Заключение в кавычки знака вопроса отключает его интерпретацию оболочкой как метасимвола.

Рис. 1. Простой листинг установленных принтеров.

Обычно, lp использует команду file для определения типа ввода, который он получает. При этом используется процесс generic, который описан ниже в документе в разделе «Каталог процессов». Для выбора специфического процессора ввода используется опция -p процесс, где процесс — это один из сценариев оболочки из каталога process.

К примеру, вывод troff может быть распечатан на принтере fn командой:

Псевдо-принтер stdout используется для преобразования файла в формат PostScript:

Документы LaTeX (и аналогично TeX) можно вывести на печать двумя командами:

LaTeX создает файл «.dvi» и не разрешает использовать конвейер со стандартным вводом lp. Чтобы просмотреть статус и очередь устройства, используйте опцию -q:

Эта команда может выводить информацию о статусе принтера и очереди печати как локальных, так и удаленных хостов. Администраторам рекомендуется работать в среде, где каталог спулинга lp распределен среди локальных и удаленных хостов. На локальных хостах ни о каком спулинге не может быть речи. Задание, запущенное выше, может быть прервано при помощи опции -k:

3. Опции

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

Опция
Переменная оболочки
Действие
имя
по-умолчанию
установка
-D DEBUG
N
1
Включает режим отладки.
-H NOHEADER
N
1
Пропускает заголовки страниц.
-L LAND
N
1
Растягивает страницу (горизонтально) по всей длине.
-M машина LPMACHID
N
машина
Устанавливает имя машины-источника.
-Q QONLY
N
1
Не запускает демон, используется для отладки.
-c n COPIES
N
n
Количество копий печати.
-d принтер LPDEST
U
принтер
Устанавливает устройство вывода, при этом другие опции опускаются.
-f шрифт, размер

FONT
POINT

N
N
шрифт
размер
Выбор стиля и размера шрифта
-i n IBIN
N
n
Выбор опций поддона вводного листа. Аргумент зависит от типа принтера. Данное число выбирает конкретный поддон и/или может использоваться для получения одно/двустороннего вывода. Если опций несколько, то они должны разделяться запятыми.
-k KILLFLAG
O
1
Прерывает (удаляет) задания из очереди.
-l n LINES
N
n
Устанавливает количество строк на логическую страницу.
-m f MAG
N
f
Увеличивает изображения на значение f. Значение должно быть позитивным.
-n n NPAG
N
n
Устанавливает n логических страниц на одну физическую. Для сжатия страниц используется простой алгоритм.
-o список OLIST
N
список
Печатает только указанные номера страниц. Список может быть последовательностью номеров, разделенных запятыми, или диапазоном. Диапазон — это пара чисел, разделенных дефисом.
-p процесс LPPROC
L
процесс
Использование препроцессора процесс взамен препроцессора, указанного в файле данного принтера.
-q LPQ
N
1
Выводит информацию о статусе принтера и очереди печати.
-r REVERSE
L
1
Переключает флаг, переворачивая страницу. Если документ уже имеет этот флаг, то этот не будет иметь никакого эффекта.
-u п-ль LPUSERID
U
п-ль
Изменяет идентификатор пользователя, который появляется на обложке.
-x смещение XOFF
N
смещение
Перемещает изображение на смещение дюймов в право. Отрицательное значение смещения переместит изображение влево. Смещение может быть любым действительным числом.
-y смещение YOFF
N
смещение
То же самое, что и выше, только теперь позитивное значение перемещает изображение вниз по вертикали.

  по-умолчанию описание установки
 
N
первоначально установлен в нулевую строку (`') в lp
 
L
установлен из элемента принтера файла devices
 
U
установлен из пользовательского окружения

Таблица 1. Список опций lp

4. Файл devices

Файл devices находится в каталоге спулинга. Каждая строка файла состоит из 12 полей, разделенных пробелами и/или символами табуляции. Поля описывают атрибуты принтера и его обслуживание. В команде lp переменная оболочки установлена для каждого атрибута; все они описаны в следующем списке:

LPDEST Название устройства, которое передается lp при помощи опции -d или определяется в переменной окружения оболочки LPDEST или же посредством файла $LPLIB/defdevice. Это название используется при создании каталогов и журнальных файлов, которые ассоциированы с операциями печати.
LOC Описывает место физического подключения принтера.
DEST_HOST Хост, как источник файлов для печати. Файлы могут распределяться на другие машины перед их передачей хосту-приемнику.
OUT_DEV Физическое название устройства или сетевой адрес, необходимые демону печати для соединения с принтером. Это поле зависит от требований демона и, если нужно, может содержать «-».
SPEED Скорость, установленная для порта. Это поле зависит от требований демона и, если нужно, может содержать «-».
LPCLASS Используется для кодирования незначительных различий между принтерами. Ключевое слово reverse используется некоторыми препроцессорами для инвертирования порядка страниц. Ключевое слово nohead используется для подавления страницы заголовков. Ключевое слово duplex используется для получения двустороннего вывода из дуплексных принтеров.
LPPROC Команда из каталога LPLIB/process используется для преобразования ввода в формат, допустимый устройством. Препроцессор вызывается спулером.
SPOOLER Команда из каталога LPLIB/spooler выполняет выборку файлов посредством команды SCHED и вызов посредством LPPROC, отправляя свой вывод в удаленный каталог спулинга. Во избежание конфликтов, происходящих когда клиент и машины-серверы используют общие каталоги спулинга, вывод непосредственно посылается в каталог спулинга машины-приемника.
STAT Команда из каталога LPLIB/stat выводит статус устройства и список заданий, находящихся в очереди печати. Информация статуса зависит от доступного принтерного и интерфейсного ПО. Информация об очереди должна быть изменена для вывода информации, полезной при проблемах трассировки. Команда SCHED используется для вывода заданий в порядке печати.
KILL Команда из каталога LPLIB/kill, удаляющая задания из очереди. Задания, которые должны быть удалены, подаются как аргументы lp.
DAEMON Команда из каталога LPLIB/daemon предназначена для асинхронного запуска и удаления заданий из очереди. Задания должны или передаваться другому хосту, или отправляться на устройство печати.
SCHED Команда из каталога LPLIB/sched используется для представления имен заданий демону и программам статистики в определенном порядке, напр., первый пришел — первый вышел, минимальный первый.

5. Поддерживаемые программы

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

5.1 Каталог процессов

Препроцессор под названием generic является препроцессором по-умолчанию для большинства принтеров. Для определения формата файла ввода используется команда file(1), затем происходит выборка подходящего препроцессора для преобразования файла в подходящий для принтера формат.

Ниже представлен список препроцессоров с описанием их функций. За полным списком препроцессоров и их описаниями обращайтесь к man-странице lp(8).

dvipost
Преобразование вывода TeX или LaTeX (файлы .dvi) в формат PostScript.
ppost
Преобразование текстовых файлов в кодировке UTF в формат PostScript. Шрифт по-умолчанию — Courier со шрифтами Lucida, заполняющими оставшуюся часть (доступного) пространства символов Unicode.
tr2post
Преобразование (устройство-незавасимого) вывода troff для устройства типа utf. Смотрите каталог /sys/lib/troff/font/devutf за табличными описаниями шрифтов troff. Также смотрите каталог /sys/lib/postscript/troff за отображениями символьного пространства troff UTF в шрифтовое пространство PostScript.
p9bitpost
Преобразование растровых изображений Plan 9 (см. bitfile(9.6)) в формат PostScript.
g3post
Преобразование факсов (формата CCITT-G31) в формат PostScript.
hpost
Обработка заголовков страниц и инвертирование страниц.

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

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

Определенные программы обработки принтера не требуют разделения предварительной обработки и спулинга. В таких случаях используется спулер под названием nospool, который лишь выполняет программу предварительной обработки. Программа принимает функции обработки и спулинга и вывод отправляется на OUT_DEV или стандартный вывод, если OUT_DEV имеет значение «-».

Спулер pcclone используется для непосредственной отправки заданий печати на принтер, подключенный к 386-совместимому порту принтера (см. lpt(3)).

5.3 Каталог статистики

Функцией сценариев оболочки в каталоге stat является представление информации о статусе принтера и его очереди печати. Если необходимо, сценарии stat могут быть доработаны для вывода информации не только о локальной, но и удаленной очередях. Эта возможность отсутствует в Plan 9 потому-что многие системы работают с общим каталогом очереди. Планировщик используется для печати очереди в порядке выполнения задания.

5.4 Каталог удаления

Сценарии kill получают аргументы из командной строки, отправляемые lp, и удаляют задание и идентификационные файлы. После того как задание удалено, общая процедура удаления выглядит таким образом:

  1. если удаляемое задание находится первым в очереди, то происходит удаление демона этой очереди,
  2. удаление файлов, связанных с заданием из очереди,
  3. попытка запуска демона.

5.5 Каталог демона

Сценарии оболочки daemon вызываются последними в lp посредством опции -Q. Процесс-демон выполняется асинхронно со своими стандартными выводом и ошибками, записываемыми в журнальный файл принтера. Последний описан в следующем разделе. Так как демон запускается асинхронно, то должен принимать сигналы, которые могут вызывать ненормальное завершение работы. Сперва демон выполняет проверку один ли он запущен, для этого используется программа LOCK из каталога /$cputype/bin/aux. Команда LOCK создает одноименный файл, также называемый файлом блокировки, в каталоге очереди принтера. Затем демон вызывает планировщик для получения имени следующего задания из очереди.

Обработка заданий может влечь их передачу на другой хост или принтер. Для индивидуальных демонов детали этой операции достаточно специфичны. Если задание было выполнено без ошибок, то оно подлежит удалению из очереди, в противном случае происходит перемещение связанных файлов в специфический для принтера каталог $LPLIB/prob. Также, демон может сделать запись в журнальный файл принтера. Перед выполнением, демон должен очистить файлы блокировок путем вызова UNLOCK.

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

5.6 Каталог планировщика

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

Она выводит список всех файлов заданий из очереди печати в упорядоченном по времени порядке. Задания, входящие в очередь, имеют точечные (.) префиксы в именах для того, чтобы планировщик не мог обращаться к ним пока они не будут выполнены.

6. Когда что-то идет не так, как нужно

Всего есть четыре каталога, куда lp записывает файлы. В версии Plan 9 они находятся в каталоге временной файловой системы (стоит отметить тот факт, что она не вспомогательная) /n/emelieother/lp. Он построен на вершине файловой системы other, которая монтируется на файловом сервере emelie. Четыре каталога временной файловой системы — это log, prob, queue и tmp. Lp связывает (см. bind(1)) первые три в каталог /sys/lib/lp для процессов и их потомков. Каталог tmp связывается в каталог /tmp, в результате чего демоны lp, запущенные пользователем «none», тоже имеют права на запись в этот каталог.

При любой инсталляции важно, чтобы эти каталоги были созданы и команда /rc/bin/lp имела правильные установки. Если вы не владеете временной файловой системой для этих каталогов, то можете создать четыре каталога log, prob, queue и tmp в $LPLIB (/sys/lib/lp) так, чтобы все имели право записывать в них.

6.1 Каталог журнальных файлов

Журнальные файлы для конкретного принтера появляются в подкаталоге каталога спулинга log/принтер. В данный момент существует всего два типа журнальных файлов. Первый используется демоном для записи ошибок и успешных завершений заданий. Это файл принтер.день, где день — это трехбуквенная аббревиатура дня недели. Он перезаписывается один раз в неделю во избежание необходимости в регулярной очистке. Второй тип журнального файла содержит статус принтера и записывается программой, которая сама держит с ним связь. Он называется принтер.st и переписывается с каждым новым заданием и хранится в каталоге $LPLIB/prob пока задание не будет выполнено. Если принтер не функционирует, эти файлы должны быть проверены первыми.

6.2 Каталог проб и ошибок :)

Если задание не создает вывод, первым делом должны быть проверены журнальные файлы. Если очевидных проблем не было найдено, попробуйте создать каталог с правами на чтение и запись в $LPLIB/prob. Последующие неудачи задания заставят демон оставить копию задания и журнальный файл связи принтера в каталоге $LPLIB/prob/принтер. Это общий прием для вывода принтера из критических состояний, за исключением ручного выключения питания принтера. После этого демон печати должен восстановится сам (дайте ему минуту). Если он не восстановится, для аварийного завершения работы демона удалите файл блокировки LOCK из каталога спулинга принтера. Перезапуск демона произойдет при отправке нового задания на принтер. Для PostScript принтеров используйте команду:

6.3 Зависшие демоны

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

7. Интерпроцессорная связь

CPU сервер Plan 9 может быть установлен как принтерный спулинг хост. Таким образом, получится машина, принимающая задания для печати и отправляющая их непосредственно на принтер. Чтобы сделать это, CPU должен прослушивать TCP порт 515, который известен как порт демона строчного принтера BSD. Когда приходит вызов из порта, выполняется файл /rc/bin/service/tcp515. Plan 9 lpdaemon может принимать задания, отправленные из систем BSD LPR/LPD. Команда /$cputype/bin/aux/lpdaemon выполняется из служебного вызова и принимает задания для печати, запросы статуса и запросы на удаление заданий. Команда /$cputype/bin/aux/lpsend отправляет задания на машины Plan 9 и обычно вызывается спулером или сценарием демона. Команда /$cputype/bin/aux/lpdsend отправляет задания на машины и принтеры, использующие протокол BSD LPR/LPD, и она также вызывается спулером или сценарием демона.

8. Благодарности

Особая признательность выражается Ричу Дричслеру (Rich Drechsler) за создание и поддержку большей части интерфейсных программ и конвертеров PostScript, без которых lp был бы пустой оболочкой. Томас Рокики (Tomas Rokicki) создал программу преобразования TeX в формат PostScript.

9. Литература

[1] Ralph Campbell, 4.3BSD Line Printer Spooler Manual, UNIX System Manager's Manual, May, 1986, Berkeley, CA
[2] Request for Comments: 1179, Line Printer Daemon Protocol, Aug 1990
[3] System V manual, date unknown

Copyright © 2000 Lucent Technologies Inc. All rights reserved.
Copyright © 2003 Перевод Андрей С. Кухар.