14. Печать

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

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

cat файл > /dev/par

Однако при таком способе возникают некоторые проблемы:
При печати лучше всего использовать функцию спулинга (spooling). При использовании функции спулинга задание на печать помещается в очередь, ожидая момента, когда принтер будет в состоянии его напечатать.

В ОСРВ QNX Neutrino существуют два различных механизма спулинга пе-
чати:
Вы можете использовать любой из способов, либо тот и другой в зависимости от начальных настроек вашей машины и сети. Далее перечислены некоторые особенности подключения принтера.
В этом случае при работе программ распознавания устройств в момент загрузки системы происходит автоматический запуск программы spooler (см. подразд. "Распознавание устройств" раздела 8). Конфигурационные файлы для большинства часто используемых принтеров находятся в каталоге /etc/printers.

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

Печать с помощью утилиты lpr

Система печати lpr поддерживает:
Для работы через систему печати lpr необходимо иметь:
Примечание. Для настройки системы lpr нужно войти в систему под учетной записью root.

Интерфейс пользователя

В систему стандартной печати входят следующие основные файлы и команды (рис. 14.1):


Рис. 14.1.
Печать с помощью утилит семейства lpr

lpd — сервис принтера

Программа lpd, которая обычно запускается на этапе загрузки системы из файла /etc/rс.d/rc.local (см. раздел 8), выполняет роль главного сервера координации и управления очередью спулера, параметры которой заданы в файле /etc/printcap. При запуске программы lpd происходит однократный просмотр базы данных /etc/printcap и перезапуск всех принтеров, для которых назначены задания на печать. При нормальной работе программа lpd принимает запросы на обслуживание сокета в домене Интернета (со спецификацией обслуживания "printer") при запросах на доступ к принтеру.

Для обработки запроса сервис принтера порождает копию собственного процесса, при этом в главном процессе продолжается анализ появления новых запросов. Для синхронизации сервисов используются простые текстовые файлы в качестве блокировки. Родительский процесс сервиса использует файл /usr/spool/output/lpd.lock, а дочерний процесс — файл .lock в каталоге спулинга принтера в соответствии с записью в файле printcap.

Взаимодействие клиентов с программой lpd происходит посредством обычного транзактного протокола. Аутентификация удаленных клиентов осуществляется на основе схемы "привилегированного порта" ("privileged port"), используемой rshd (см. подразд. "Управление доступом" далее в этом разделе).

lpr — запустить задание на печать

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

lprq — показать очередь принтера

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

Имеется два формата отображения выходной информации:
lprrm — удалить задания из очереди

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

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

lprc — программа управления принтером

Программа lprc используется для управления системой печати lpr. Для каждого принтера, заданного в файле /etc/printcap, команда lprc может:
Программа lprc предоставляет пользователю root возможность локального управления принтерами. Далее приведен список основных команд программы и их назначение. Подробное описание формата каждой команды и полный список команд можно найти в руководстве "Описание программы. Часть 1. Справочник по утилитам" КПДА.10964-01 13 01.
Команда abort не удаляет из очереди спулера каких-либо заданий на печать, для этого существует команда lprrm.
Например, вы можете использовать команду disable при тестировании новых фильтров принтера, поскольку при этом разрешается печать пользователю root, но запрещается для всех остальных пользователей. Другая распространенная ситуация применения этой команды запретить пользователям помещать задания в очередь, если ожидается недоступность принтера в течение длительного времени.
Каталоги спулинга

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

Примечание. Сервис lpd не работает без каталога спулинга и не выдает никаких сообщений об этом. Поэтому весьма полезно при отладке проблем с принтером запускать работу системного журнала (см. описание утилиты syslogd в руководстве "Описание программы. Часть 1. Справочник по утилитам" КПДА.10964-01 13 01). Тогда вы сможете прочесть сообщения об ошибках в файле /var/log/syslog.

Управление доступом

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

:rg=lprgroup:


Для передачи задания на печать конкретному принтеру пользователи должны относиться к группе lprgroup. По умолчанию доступ разрешен всем пользователям. Имейте в виду, что после того как файлы попали в локальную очередь, они могут быть напечатаны на локальном принтере или перенаправлены на другой хост (в зависимости от конфигурации).
Хост, на котором находится клиент, должен быть указан в файле /etc/hosts.equiv или /etc/hosts.lpd, а сообщение о запросе должно исходить из зарезервированного порта.

Примечание. В других утилитах (например, rlogin) для определения принадлежности к хосту тоже используется информация из файла /etc/hosts.equiv. Файл /etc/hosts.lpd служит только для того, чтобы установить, какие хосты имеют доступ к принтерам.

Для разрешения доступа только тем удаленным пользователям, которые имеют учетные записи на локальном хосте, используйте поле rs в записи принтера в файле /etc/printcap.

:rs:


Сетевой администратор

Если вы хотите печатать на удаленном принтере, то в ОСРВ Neutrino необходимо запустить сетевой администратор io-pkt*. Эта программа загружает разделяемые объекты (библиотеки DLL), которые обеспечивают поддержку требуемых протоколов и драйверов устройств.

Например, чтобы загрузить полный стек протоколов TCP/IP npm-tcpip.so и драйвер адаптеров Ethernet, совместимых с NE-2000 (devn-ne2000.so), нужно ввести команду io-pkt* в таком формате:

io-pkt-v4 -dne2000


Примечание. Чтобы использовать стек TCP/IP таким образом, возможно, потребуется задать конфигурацию своего сетевого интерфейса с указанием типа и номера сетевой интерфейсной платы (NIC), IP-адреса и сетевой маски интерфейса TCP/IP. Более подробные сведения об этом приведены в разделе 13.

Параметры принтера: файл /etc/printcap

До начала печати на узлах должна присутствовать информация о конкретном используемом принтере (как минимум, должно быть известно, где находится принтер). Описание принтера на каждом узле хранится в файле /etc/printcap. В базе данных /etc/printcap для каждого принтера имеется одна или несколько записей.

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

В данном разделе приводится описание основных полей файла. Сведения об остальных полях приведены в руководстве "Описание программы. Часть 1. Справочник по утилитам" КПДА.10964-01 13 01, в разделе, посвященном файлу /etc/printcap.

Типовые начальные установки

Вот как выглядит типичный файл /etc/printcap, который вы можете модифицировать:

lpt1|tpptr|printer in Docs department:\

:lp=/dev/par1:\

:sd=/usr/spool/output/lpt1:\

:lf=/usr/adm/lpd-errs:\

:mx#0:\

:sh:

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

Далее приводятся пояснения, касающиеся каждой строки вышеприведенной записи.
Перечисляются известные имена принтера. Имена разделяются символом вертикальной черты (|). Самое последнее имя — это длинное имя, полностью идентифицирующее принтер; только в нем допускается использование пробелов.

Записи могут размещаться на нескольких строках. Для указания продолжения на следующей строке используется символ обратной косой черты (\), при этом он должен быть последним символом на переносимой строке. Для удобства чтения можно включать пустые поля.
Имя устройства, которое открывается для вывода (имя по умолчанию /dev/lp).
Каталог спулинга (путь по умолчанию /usr/spool/output/lpd). Для каждого принтера должен быть определен отдельный каталог спулинга. При его отсутствии задание на печать будет передаваться на другие принтеры в зависимости от того, какой из них будет запущен сервисом раньше. Каталог спулинга принято называть таким же именем, что и соответствующий ему принтер.

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

Примечание. Иногда сообщения об ошибках, которые посылаются на стандартное устройство для вывода ошибок, не сохраняются в файле отчетов. Настоятельно рекомендуется использовать программу-сервис для формирования системных журнальных записей syslogd.
Удалить принимаемые по умолчанию ограничения на размер буфера для спулинга.
Подавить печать пакетного заголовка (burst header) — страницы, на которой приводится список идентификаторов пользователей и информация о задании на печать.

Принтеры на последовательных портах

При подключении принтера через последовательный порт необходимо установить соответствующую скорость и режимы терминала. Далее приводится пример, где заданы параметры принтера DecWriter III, подключенного локально к последовательному порту с пропускной способностью 1200 бод.

lp|LA-180 DecWriter III:\

:lp=/dev/lp:br#1200:fs#06320:\

:tr=\f:of=/usr/lib/lpf:lf=/usr/adm/lpd-errs:

Здесь:
Удаленные принтеры

Для принтеров, которые подключены к удаленным хостам, запись lp следует оставить пустой. Например, приводимая далее запись в файле /etc/printcap направляет вывод на принтер lp, подключенный к машине ucbvax.

lp|default line printer:\

:lp=:rm=ucbvax:rp=lp:sd=/usr/spool/vaxlpd:

Поле rm задает имя удаленной машины, соединение с которой нужно установить. Это имя должно быть известным именем хоста для компьютера в сети. Поле rp указывает, что имя удаленного принтера — lp (в данном случае это можно не указывать, поскольку такое значение устанавливается по умолчанию). Поле sd определяет, что в качестве каталога спулинга задается /usr/spool/vaxlpd, а не задаваемый по умолчанию каталог /usr/spool/output/lpd.

Фильтры

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

Выходной фильтр не годится для ведения учета, потому что его запуск происходит однократно, через него фильтруются все текстовые файлы, он не пропускает имена зарегистрированных пользователей и не идентифицирует начало или конец задания.
Запускаются для каждого печатаемого файла и выдают учетную информацию, если присутствует поле af в записи для принтера файла printcap. Если такое поле присутствует как во входном, так и выходном фильтрах, то выходной фильтр используется только для печати заглавной страницы (banner page). После этого выходной фильтр останавливается, давая возможность работать входным фильтрам.
Служат для преобразования файлов из одного формата в другой. Например:

va|varian|Benson-Varian:\

:lp=/dev/va0:sd=/usr/spool/vad:of=/usr/lib/vpf:\

:tf=/usr/lib/rvcat:mx#2000:pl#58:px=2112:py=1700:tr=\f:


Поле tf определяет, что файл /usr/lib/rvcat используется в качестве фильтра при печати с выходным форматом troff. Этот фильтр необходим для установки устройства в режим печати текста при работе с текстовыми файлами и в режим плоттера при печати файлов типа troff или растровых изображений. Обратите внимание на то, что запись pl определяет размер страницы 58 строк при размере бумаги 8,511 дюймов (т. е. 2127 см).

Для разрешения ведения учета нужно добавить фильтр af в записи varian, например, таким образом:

va|varian|Benson-Varian:\

:lp=/dev/va0:sd=/usr/spool/vad:of=/usr/lib/vpf:\

:if=/usr/lib/vpf:tf=/usr/lib/rvcat:af=/usr/adm/vaacct:\

:mx#2000:pl#58:px=2112:py=1700:tr=\f:


Примечание. В состав ОСРВ Neutrino не входят фильтры печати. Эти фильтры нужно либо перенести из другой ОС типа UNIX, либо написать самостоятельно. Если вы не хотите это делать, то можно использовать систему спулинга, в которой имеются драйверы печати для конкретных семейств наиболее популярных принтеров. См. раздел, касающийся утилиты spooler, в руководстве "Описание программы. Часть 1. Справочник по утилитам" КПДА.10964-01 13 01, и подразд. "Печать с помощью утилиты spooler" далее в этом разделе.

Фильтры вызываются сервисом lpd. Стандартными входными данными для фильтров являются данные для печати, стандартным выходом — принтер. Стандартные сообщения об ошибках добавляются в файл lf, который является журналом ошибок (в качестве альтернативы можно использовать систему syslogd). При отсутствии ошибок фильтр должен возвращать код 0, при необходимости перепечатки — код 1, а при необходимости снятия задания на печать — код 2.

Когда утилита lprrm посылает сигнал SIGINT процессу lpd, который управляет печатью, сигнал SIGINT посылается всем фильтрам и их потомкам. Этот сигнал может перехватываться фильтрами, для которых необходимо выполнить операции очистки (например, удаление временных файлов).

Аргументы, передаваемые из программы lpd фильтру, зависят от типа фильтра.

фильтр -wширина -lдлина


Значения
ширина и длина берутся из записей pw и pl в базе данных /etc/printcap.

фильтр [-c] -wширина -lдлина -iотступ –nвходное_имя -hхост файл_учета


Необязательный ключ -c используется лишь в случае, когда управляющие символы должны пересылаться принтеру без их интерпретации, т. е. когда для печати в команде lpr используется ключ -l. Параметры -w и -l имеют тот же смысл, что и в выходном (of) фильтре. Параметры -n и -h применяются для задания входного имени пользователя и имени хоста владельца задания. Последний аргумент является именем файла учета из записи в файле /etc/printcap.

фильтр -wширина –yдлина –nвходное_имя -hхост файл_учета


Ключи -x и -y определяют горизонтальный и вертикальный размеры страницы в пикселах (значения берутся из записей px и py в файле /etc/printcap). Остальные аргументы имеют тот же смысл, что и во входном (if) фильтре.

Примеры содержимого файла /etc/printcap

В этом разделе приводится несколько примеров, показывающих, как задаются описания принтеров. См. также описание файла /etc/printcap в руководстве "Описание программы. Часть 1. Справочник по утилитам" КПДА.10964-01 13 01.

USB принтер

При подключении USB-принтера к компьютеру и запуске USB стека и devu-prn, как было описано в подразделе «Устройства USB» раздела «Подключение оборудования», необходимо, чтобы содержимое файла /etc/printcap было следующим:

hpps: \

:lp=/dev/usbpar0

:sd=/usr/spool/output/hpps


Данный файл устанавливает имя hpps для USB-принтера, идентифицирует файл для открытия /dev/usbpar0 (или любого другого устройства, созданного devu-prn), идентифицирует каталог спулинга /usr/spool/output/hpps.

Для доступа к принтеру необходимо установить lpr -Phpps или задать hpps переменную окружения PRINTER.

Примечание. Необходимо убедиться, что каталог спулинга существует.

Единственный принтер

Пусть имеются два узла: node1 и node2, при этом в узле node1 имеется принтер, присоединенный к /dev/par1 (рис. 14.2).

Тогда файл /etc/printcap на узле node1 должен быть таким:

lpt1:\

:lp=/dev/par1:

Рис. 14.2. Единственный принтер

В файле просто задается имя lpt1 для принтера, присоединенного к /dev/par1. Нет необходимости описывать что-нибудь еще, поскольку установки по умолчанию выполняют все необходимое. Для получения доступа к принтеру с узла node1 нужно выдать команду lpr -Plpt1 или установить для переменной окружения PRINTER значение lpt1.

Примечание. Убедитесь в том, что существует каталог спулинга и что для узла node2 в файле /etc/hosts.lpd имеется запись, указывающая на узел node1.

Файл /etc/printcap на узле node2 должен быть таким:

rlpt1:\

:rm=node1:rp=lpt1:lp=:


В этом файле определяется, что удаленному хосту с принтером, имеющим имя lpt1, соответствует узел node1. Имя локального принтера (rlpt1) используется локальными клиентами и может быть аналогичным имени удаленного принтера lpt1.

Следует проверить, что в файле /etc/hosts имеется запись для узла node1.

Несколько принтеров

Теперь добавим к узлу node1 другой принтер, на этот раз он подключается к /dev/par2 (рис. 14.3).

Рис. 14.3. Несколько принтеров

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

Файл /etc/printcap на узле node1 имеет следующее содержимое:

lpt1:\

:lp=/dev/par1:sd=/usr/spool/output/lpt1:

lpt2:\

:lp=/dev/par2:sd=/usr/spool/output/lpt2:


В приведенном описании определяются следующие принтеры:
Проверьте, чтобы в файле /etc/hosts.lpd на узле node1 имелась запись для узла node2.

Для того чтобы обращаться в удаленном режиме к этим принтерам с узла node2, нужно на узле node2 в файле /etc/printcap создать такие записи:

lpt1:\

:rm=node1:rp=lpt1:sd=/usr/spool/output/lpt1:lp=:

lpt2:\

:rm=node1:rp=lpt2:sd=/usr/spool/output/lpt2:lp=:

Таким образом, были определены два принтера, которые размещаются на узле node1 с именами, которые можно использовать на узле node2. Проверьте, чтобы в файле /etc/hosts имелась запись для узла node1.

Локальные и удаленные принтеры

Что нужно сделать, если мы захотим переместить один из двух принтеров (например, lpt2) с узла node1 на узел node2 (рис. 14.4)?

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

lpt1:\

:lp=/dev/par1:sd=/usr/spool/output/lpt1:

lpt2:\

:rm=node2:rp=lpt2:sd=/usr/spool/output/lpt2:

Рис. 14.4. Локальный и удаленный принтеры

lpt1:\

:rm=node1:rp=lpt1:sd=/usr/spool/output/lpt1:

lpt2:\

:lp=/dev/par1:sd=/usr/spool/output/lpt2:

lpt1:\

:rm=node1:rp=lpt1:sd=/usr/spool/output/lpt1:

lpt2:\

:rm=node2:rp=lpt2:sd=/usr/spool/output/lpt2:

Проверьте, чтобы на каждом узле в файле /etc/hosts имелись бы записи для узлов node1 и node2. Также необходимо проверить наличие записей на узлах node1 и node2 в файле /etc/hosts.lpd для каждого узла, с которого могут использоваться принтеры.

Если вы произведете настройки своей сети для выполнения удаленной печати в соответствии с приведенными примерами, то вы сможете послать файл, находящийся в каталоге /tmp/test на узле node2, на принтер, подключенный к узлу node1, с помощью такой команды:

lpr -h -Plpt1 /tmp/test

В этом случае происходит следующее.
Удаленная печать на принтер, находящийся в другой сети

С помощью протокола TCP/IP и утилиты lpr можно выполнять печать файла на удаленном принтере, присоединенном к серверу другой сети. Нужно просто сделать соответствующую настройку сетевого узла ОСРВ Neutrino для удаленной печати, а удаленный сервер настроить на работу по протоколу TCP/IP и на обработку принтеров, совместимых с требованиями утилиты lpr.

Например, пусть необходимо напечатать PostScript-файл /root/junk.ps с некоторого узла сети ОСРВ Neutrino, но единственный доступный PostScript-принтер (windows_printer) присоединен к серверу Windows с IP-адресом 10.2.1.8.

Вначале нужно убедиться, что Windows-сервер сконфигурирован для печати через протокол TCP/IP и что принтер совместим с утилитой lpr. После этого, войдя под учетной записью root с узла сети ОСРВ Neutrino, нужно выполнить следующие действия.

rlpt4:\

:rm=windows_server:lp=:rp=windows_printer:\

:sd=/usr/spool/output/lpd/rlpt4:

10.2.1.8 windows_server

mkdir /usr/spool/output/lpd/rlpt4

Для запуска печати PostScript-файла на принтере введите следующую команду:

lpr -Prlpt4 junk.ps


Удаленная печать на TCP/IP-принтере с использованием утилиты lpr

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

10.2.0.4 tcpip_printer

rlpt2:\

:rm=tcpip_printer:rp=/ps:sd=/usr/spool/output/lpd/rlpt2:

В этом примере видно, что tcpip_printer используется в качестве имени удаленной машины (в данном случае роль машины выполняет непосредственно принтер), а каталог спулинга определен как /usr/spool/output/lpd/rlpt2. Обратите внимание на то, что удаленный принтер определен как /ps. В некоторых сетях это имя назначается принтерам, которые могут работать с файлами формата PostScript. Нужно отыскать то имя, которое необходимо для работы с принтером в требуемом формате. Для работы с разными форматами печатаемых файлов могут требоваться разные имена (например, для печати PostScript-файлов и обычных текстовых файлов).

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

lpr —Prlpt2 /root/junk.ps

По этой команде PostScript-файл с именем /root/junk.ps посылается на принтер с именем tcpip_printer, имеющий IP-адрес 10.2.0.4.

Примечание. В приведенном примере мы выбрали простой вариант отправки PostScript-файла на PostScript-принтер. Это легко реализовать, поскольку форматирование встроено в текст PostScript-файла. Иногда может потребоваться фильтрация содержимого файла, отправленного для печати с помощью утилиты lpr. Для принтера можно определить фильтр посредством добавления соответствующей записи в файл /etc/printcap (более подробно об этом см. в разд. "Фильтры" ранее в этом разделе).

Печать с помощью утилиты spooler

В качестве альтернативы стандартному механизму печати с использованием UNIX-подобного семейства программ lp* в ОСРВ Neutrino служит утилита spooler. Она применяется в приложениях графической оболочки Photon для печати. Для преобразования выходного графического потока (draw-stream) оболочки Photon (phs) в формат, воспринимаемый принтером, используется специальный фильтр.

Начальные установки spooler

Утилита spooler обычно запускается программой распознавания устройств (enumerator) при старте ОСРВ QNX Neutrino (см. раздел 8). Утилита управляет работой одного принтера, однако можно запускать более одного экземпляра утилиты spooler.

После запуска утилиты spooler (вручную или на системном уровне) происходит следующее (рис. 14.5):

/dev/printers/имя_принтера/spool

/var/spool/printers/имя_принтера.хост


Рис. 14.5. Печать с помощью утилиты spooler

В каталоге /etc/printers хранятся файлы общей конфигурации для наиболее часто используемых типов принтеров, в том числе перечисленные в табл. 14.1.

Таблица 14.1

Принтер

Файл конфигурации

Фильтр Photon

Canon

bjc.cfg

phs-to-bjc

Epson

epson.cfg

phs-to-escp2

Epson IJS

epijс.cfg

phs-to-ijs

Hewlett-Packard

pcl.cfg

phs-to-pcl

PostScript

ps.cfg

phs-to-ps


Существует также специальный фильтр phs-to-bmp, с помощью которого файл графического потока оболочки Photon преобразуется в формат BMP. В файлах конфигурации определяются возможные установки принтера и установки по умолчанию, а также, какой из фильтров подходит для данного принтера.

Когда производится печать из приложения оболочки Photon, то файл для печати отправляется в каталог спулинга /dev/printers/имя_принтера/spool. Приложение оболочки Photon может построить другой файл конфигурации для выбранного принтера в зависимости от введенной дополнительной информации.

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

cp мой_файл /dev/printers/имя_принтера/raw


Когда программа spooler обнаруживает задание на печать в каталоге /dev/printers/имя_принтера/raw, файл задания копируется в каталог спулинга /var/spool/printers/имя_принтера.хост, после чего запускается соответствующий фильтр, с помощью которого происходит подготовка файла и отправка его на принтер.

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

Если в приложении оболочки Photon вызывается команда предварительного просмотра печати (print preview), то в этом случае файл отправляется для обработки утилитой preview. Если необходимо просмотреть очередь печати или выполнить управление ею, то нужно запустить из командной строки команду prjobs или из меню запуска (Launch) выбрать пункт меню Utilities→Print Manager. Более подробные сведения приведены в руководстве "Описание программы. Часть 1. Справочник по утилитам" КПДА.10964-01 13 01.

Печать с использованием USB принтера

При подключении USB принтера к компьютеру и запуске USB-стека и devu-prn, как описано в подразделе «USB-устройство» раздела «Подключение оборудования», необходимо запустить дополнительно spooler для управления (например, в /etc/rc.d/rc.local).

Примечание. QNX Neutrino не может обнаруживать (детектировать) USB принтеры.

Для установки USB принтера необходимо выполнить следующее:

1 Создать /usr/spool/output/device, где device – это устройство, созданное devu-prn для принтера (например, usbpar0).

2 Запустить спулер, заданный принтером. Например:

spooler -d /dev/usbpar0


Принтер должен появится в /dev/printers.

Удаленная печать по протоколу Qnet

Для печати через сеть Qnet необходимо отправить файл в каталог /net/имя_узла/dev/printers/имя_принтера/spool. Программа spooler для принтера должна быть запущена на узле с именем имя_узла.

Удаленная печать по протоколу TCP/IP

Для настройки печати с использованием программы spooler на удаленном принтере необходимо перенаправить задание на печать программе lpr. Такая возможность обеспечивается тем, что задание на печать пересылается на принтер фильтром. Поэтому необходимо просто указать имя удаленного принтера в командной строке фильтра в файле конфигурации, используемом программой spooler.

Для того чтобы освоить такую возможность, попробуйте сначала организовать работу удаленного принтера через программу lpr (см. разд. "Удаленная печать на TCP/IP-принтере с использованием утилиты lpr" ранее в этом разделе). После этого выполните следующее.

cp /etc/printers/ps.cfg /etc/printers/test.cfg

Filter = phs:$d:phs-to-ps

Filter = raw:$d:cat


Командные строки фильтра имеют формат:

источник:приемник:фильтр


Командная строка фильтра phs указывает фильтру обработать файлы с расширением .phs посредством фильтра с именем phs-to-ps прежде, чем отправить их по адресу назначения, указанному программой spooler. Команда фильтра raw предназначена для утилит, которые на выходе дают уже корректно форматированный для печати результат.

Filter = phs:$d:phs-to-ps

на такой:

Filter = phs:ps:phs-to-ps

Filter ps:$d:lpr -Prlpt2


Эти действия приведут к изменению задаваемого спулером адреса назначения на значение ps, так что после преобразования .phs-файла фильтром phs-to-ps в формат ps файл будет отправлен на ps-фильтр. Благодаря добавленной строке ps-фильтра, файлы отправляются для обработки в программу lpr, в качестве ключа которой указано выполнение печати на удаленном принтере (точно такая же ситуация была описана в разд. "Удаленная печать на TCP/IP-принтере с использованием утилиты lpr" ранее в этом разделе).

Возможно, вам интересно узнать, что произошло с адресом назначения ($d), передаваемым программой spooler. Этот адрес отброшен, потому что программа lpr (в отличие от фильтра phs-to-ps) не возвращает задание фильтру, а сама завершает все необходимые действия.

spooler -d /dev/null -с /etc/printers/test.cfg -n rlpt2 &


С помощью ключа
-n определяется имя принтера, которое появляется в диалоге печати приложения оболочки Photon. Теперь можно печатать PostScript-файлы на удаленном TCP/IP-принтере либо из приложений оболочки Photon, либо из командной строки. Выберите необходимый принтер (в примере это rlpt2) в диалоговом окне выбора принтера (Select Printer). Скопируйте файл для печати в каталог, используемый спулером, с помощью такой команды:

cp /root/my_file.ps /dev/printers/rlpt2/spool/


Примечание
. Примеры файлов конфигурации для печати с использованием программ lpr, SAMBA и NCFTP даны в приложении.

Устранение неполадок

Сообщения об ошибках в программах семейства
lpr


Приводимые далее описания сообщений об ошибках, генерируемые утилитами печати семейства lp*, помогут вам в разрешении возникающих в процессе печати проблем.
Отправленный на печать файл имеет больший размер, чем заданный максимальный размер файла для принтера. Этот размер определен параметром mx в соответствующей записи файла printcap.
Неизвестный принтер. Принтер не найден в базе данных /etc/printcap, возможно, из-за пропущенной или неправильной записи. Задание поставлено в очередь, но невозможно запустить сервис. Не удалось подключиться к сервису lpd на локальной машине, возможно, из-за зависания сервера принтера или из-за отсутствия ответа от сервера. Суперпользователь может перезапустить сервис lpd с помощью команды:

/usr/bin/lpd


Проверить состояние сервиса главного принтера можно с помощью команды:

sin -P lpd

Если пользователь утилиты lpr не является root, а идентификатор группы не относится к категории daemon, то проверку можно выполнить с помощью команды:

ls -lg /usr/bin/lpr

Отключена работа очереди принтера. Данное сообщение означает, что работа очереди была отключена командой lprc disable (см. разд. "lprc — программа управления принтером" ранее в этом разделе), чтобы программа lpr не могла помещать файлы в очередь. Обычно такая операция выполняется перед тем, как принтер отключается на длительное время. Суперпользователь может снова включить принтер с помощью утилиты lprc.
Ожидание готовности принтера. Сервис не может открыть печатающее устройство. Это может быть вызвано несколькими причинами (например, принтер отключен, кончилась или замята бумага). Конкретная причина выясняется по значению кода ошибки, возвращаемого системным драйвером принтера. Некоторые принтеры не могут передать информацию, позволяющую определить точную причину проблемы (отключен принтер или произошел другой отказ). Это особенно свойственно принтерам, подключаемым через последовательный порт.

Другой возможной причиной появления такого сообщения является то, что устройство было открыто в эксклюзивном режиме каким-то другим процессом, например, выходным фильтром. Все что можно сделать в этом случае — аварийно завершить мешающую программу и перезапустить принтер с помощью утилиты lprc.
Принтер готов и печатает. Программа lprq проверяет, существует ли процесс сервиса для принтера, и выдает текущий статус файла, находящегося в каталоге спулинга. Если сервис не отвечает, то пользователь с учетной записью root может воспользоваться программой lprc для аварийного завершения текущего сервиса и для запуска его нового экземпляра.
Ожидание появления хоста. Это означает, что сервис пытается соединиться с удаленной машиной host для того, чтобы послать файлы из локальной очереди. Если удаленная машина работает, то, вероятнее всего, что зависла или заблокирована программа lpd на удаленной машине. В этом случае ее нужно перезапустить.
Отправка файлов хосту. Файлы в настоящий момент отправляются на удаленный хост. Если этого не происходит, то пользователь с учетной записью root должен воспользоваться программой lprc для аварийного завершения и перезапуска локального сервиса.
Предупреждение: принтер отключен. Данный принтер был помечен программой lprc как недоступный.
Предупреждение: отсутствует сервис. Процесс lpd (сервис), заданный в файле блокировки данного каталога и следящий за очередью спулера, не существует. Обычно такое происходит при неожиданной блокировке сервиса. Для диагностики проблемы проверьте записи в журнальном файле с сообщениями об ошибках для данного принтера и в системном журнальном файле syslog. Для перезапуска сервиса lpd введите команду:

lprc restart printer

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

    lprrm: принтер: cannot restart printer daemon

Невозможно перезапустить сервис принтера. Этот случай аналогичен ситуации, когда от программы lpr поступает сообщение о невозможности запуска сервиса.
Невозможно запустить принтер. Этот случай аналогичен ситуации, когда от программы lpr поступает сообщение о невозможности запуска сервиса.
Невозможно проверить каталог спулинга. Ошибочные сообщения, начинающиеся со слова cannot (невозможно), обычно являются следствием неправильных прав доступа или режима защиты в отношении файла блокировки, каталога спулинга или программы lprc.
При работе утилиты lpd может выдаваться много различных сообщений, которые поступают в системный журнал программы syslogd. Большинство сообщений касаются файлов, которые нельзя открыть. Обычно это означает, что есть некорректности в файле /etc/printcap или в режимах защиты других файлов. Файлы могут быть недоступны, если к ним обращаются иными средствами (а не с помощью программы lpr).

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

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

Если не работает печать отправленного файла, то вы можете получить сообщение об ошибке от одной из утилит семейства lp* (см. пункт "Сообщения об ошибках утилиты lpr"). Если же не появляется никаких сообщений об ошибках, то можно попробовать применить приводимые ниже действия.