Руководство по спулеру печати 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 требует обязательного указания устройства вывода. Это можно сделать одним из трех способов:
- Файл $LPLIB/defdevice должен содержать имя устройства вывода по-умолчанию. Этот вариант не практичен в системах с несколькими принтерами.
- Имя устройства можно явно указать в переменной окружения LPDEST. Этот вариант является более практичным решением в системах с несколькими принтерами. При выборе этого способа происходит автоматическое аннулирование спецификации defdevice.
- Опция -d принтер команды lp определяет принтер как устройство, на которое будет направляться весь вывод. В этом случае происходит аннулирование предыдущих двух спецификаций.
Если принтер имеет значение ?, то будет выведен список принтеров и другая информация из файла devices, как это показано на Рис. 1. Заключение в кавычки знака вопроса отключает его интерпретацию оболочкой как метасимвола.
% lp -d'?' device location host class fn 2C-501 helix post/2+600dpi+duplex pcclone - - post+nohead peacock 2C-501 cetus post/2+300dpi+nohead+color ps83 st8_fl3 rice post+300dpi+reverse psu 2C-501 cetus post/2+1200dpi . . . %
Рис. 1. Простой листинг установленных принтеров.
Обычно, lp использует команду file для определения типа ввода, который он получает. При этом используется процесс generic, который описан ниже в документе в разделе «Каталог процессов». Для выбора специфического процессора ввода используется опция -p процесс, где процесс — это один из сценариев оболочки из каталога process.
К примеру, вывод troff может быть распечатан на принтере fn командой:
% troff -ms lp.ms | lp -dfn
Псевдо-принтер stdout используется для преобразования файла в формат PostScript:
% troff -ms lp.ms | lp -dstdout > lp.ps
Документы LaTeX (и аналогично TeX) можно вывести на печать двумя командами:
% latex lp.tex . . % lp lp.dvi . . %
LaTeX создает файл «.dvi» и не разрешает использовать конвейер со стандартным вводом lp. Чтобы просмотреть статус и очередь устройства, используйте опцию -q:
% lp -dpsu -q daemon status: : 67.17% sent printer status: %%[ status: busy; source: lpd ]%% queue on cetus: job user try size rice29436.1 pg 0 17454 slocum17565.1 ches 1 49995 %
Эта команда может выводить информацию о статусе принтера и очереди печати как локальных, так и удаленных хостов. Администраторам рекомендуется работать в среде, где каталог спулинга lp распределен среди локальных и удаленных хостов. На локальных хостах ни о каком спулинге не может быть речи. Задание, запущенное выше, может быть прервано при помощи опции -k:
$ lp -dpsu -k rice29436.1 rice29436.1 removed from psu queue on cetus
3. Опции
В системе есть много опций по управлению заданиями. Работу по настройке опций проводят программы lp, таким образом, каждая из них может использоваться различными программами преобразования и интерфейса. Не все опции применимы ко всем средам печати. Таблица 1 содержит стандартные опции lp, их описание и настройки переменных оболочки.
|
|
|
||
|
|
|
||
-D | DEBUG |
|
|
Включает режим отладки. |
-H | NOHEADER |
|
|
Пропускает заголовки страниц. |
-L | LAND |
|
|
Растягивает страницу (горизонтально) по всей длине. |
-M машина | LPMACHID |
|
|
Устанавливает имя машины-источника. |
-Q | QONLY |
|
|
Не запускает демон, используется для отладки. |
-c n | COPIES |
|
|
Количество копий печати. |
-d принтер | LPDEST |
|
|
Устанавливает устройство вывода, при этом другие опции опускаются. |
-f шрифт, размер |
FONT |
N |
размер |
Выбор стиля и размера шрифта |
-i n | IBIN |
|
|
Выбор опций поддона вводного листа. Аргумент зависит от типа принтера. Данное число выбирает конкретный поддон и/или может использоваться для получения одно/двустороннего вывода. Если опций несколько, то они должны разделяться запятыми. |
-k | KILLFLAG |
|
|
Прерывает (удаляет) задания из очереди. |
-l n | LINES |
|
|
Устанавливает количество строк на логическую страницу. |
-m f | MAG |
|
|
Увеличивает изображения на значение f. Значение должно быть позитивным. |
-n n | NPAG |
|
|
Устанавливает n логических страниц на одну физическую. Для сжатия страниц используется простой алгоритм. |
-o список | OLIST |
|
|
Печатает только указанные номера страниц. Список может быть последовательностью номеров, разделенных запятыми, или диапазоном. Диапазон — это пара чисел, разделенных дефисом. |
-p процесс | LPPROC |
|
|
Использование препроцессора процесс взамен препроцессора, указанного в файле данного принтера. |
-q | LPQ |
|
|
Выводит информацию о статусе принтера и очереди печати. |
-r | REVERSE |
|
|
Переключает флаг, переворачивая страницу. Если документ уже имеет этот флаг, то этот не будет иметь никакого эффекта. |
-u п-ль | LPUSERID |
|
|
Изменяет идентификатор пользователя, который появляется на обложке. |
-x смещение | XOFF |
|
|
Перемещает изображение на смещение дюймов в право. Отрицательное значение смещения переместит изображение влево. Смещение может быть любым действительным числом. |
-y смещение | YOFF |
|
|
То же самое, что и выше, только теперь позитивное значение перемещает изображение вниз по вертикали. |
по-умолчанию | описание установки | |
|
первоначально установлен в нулевую строку (`') в lp | |
|
установлен из элемента принтера файла devices | |
|
установлен из пользовательского окружения |
Таблица 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, и удаляют задание и идентификационные файлы. После того как задание удалено, общая процедура удаления выглядит таким образом:
- если удаляемое задание находится первым в очереди, то происходит удаление демона этой очереди,
- удаление файлов, связанных с заданием из очереди,
- попытка запуска демона.
5.5 Каталог демона
Сценарии оболочки daemon вызываются последними в lp посредством опции -Q. Процесс-демон выполняется асинхронно со своими стандартными выводом и ошибками, записываемыми в журнальный файл принтера. Последний описан в следующем разделе. Так как демон запускается асинхронно, то должен принимать сигналы, которые могут вызывать ненормальное завершение работы. Сперва демон выполняет проверку один ли он запущен, для этого используется программа LOCK из каталога /$cputype/bin/aux. Команда LOCK создает одноименный файл, также называемый файлом блокировки, в каталоге очереди принтера. Затем демон вызывает планировщик для получения имени следующего задания из очереди.
Обработка заданий может влечь их передачу на другой хост или принтер. Для индивидуальных демонов детали этой операции достаточно специфичны. Если задание было выполнено без ошибок, то оно подлежит удалению из очереди, в противном случае происходит перемещение связанных файлов в специфический для принтера каталог $LPLIB/prob. Также, демон может сделать запись в журнальный файл принтера. Перед выполнением, демон должен очистить файлы блокировок путем вызова UNLOCK.
По разным требованиям и прихотям было разработано несколько нестандартных программ. Примером одной из таких программ является программа, анонсирующая завершение выполнения заданий посредством вызова seemail. Еще один вариант, использование синтезатора речи, создающего голосовые объявления. Если немного поэксперименировать, то можно создать и другие не менее интересные демоны.
5.6 Каталог планировщика
Планировщик решает, какие файлы заданий должны быть выполнены, и в каком порядке. Наиболее часто используемым планировщиком считается программа FIFO, выглядит она так:
ls -tr $* | sed -n -e 's/.* *//' \ -e '/^[0-9][0-9]*.[1-9][0-9]*$/p'
Она выводит список всех файлов заданий из очереди печати в упорядоченном по времени порядке. Задания, входящие в очередь, имеют точечные (.) префиксы в именах для того, чтобы планировщик не мог обращаться к ним пока они не будут выполнены.
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 принтеров используйте команду:
echo '%!PS' | lp
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 Перевод Андрей
С. Кухар.