14. Печать
Обзор систем печати
Самый простой способ напечатать
файл — это послать его непосредственно на принтер.
Например, если принтер подключен к параллельному порту
компьютера, то для вывода на печать нужно просто ввести
строку:
cat файл >
/dev/par
Однако при таком способе
возникают некоторые проблемы:
-
если в конце команды не ввести знак амперсанда
(&), то другую команду
будет невозможно ввести до полного окончания печати
файла;
-
если принтер уже выполняет печать или если
невозможно обработать отправленный тип файла, то
результат печати может быть искажен, и вы просто зря
израсходуете бумагу.
При печати
лучше всего использовать функцию спулинга
(spooling). При использовании функции спулинга задание на
печать помещается в очередь, ожидая момента, когда принтер
будет в состоянии его напечатать.
В ОСРВ QNX Neutrino
существуют два различных механизма спулинга пе-
чати:
-
с использованием стандартной, аналогичной UNIX
утилиты lpr (см.
разд. "Печать с помощью утилиты lpr" далее в этом
разделе);
-
с использованием утилиты spooler (см.
подразд. "Печать с помощью утилиты spooler" далее
в этом разделе).
Вы можете
использовать любой из способов, либо тот и другой в
зависимости от начальных настроек вашей машины и сети. Далее
перечислены некоторые особенности подключения принтера.
-
При подключении USB-принтера
к компьютеру, необходимо запустить USB-стек и devu-prn (см. подразд.
«USB-устройства» в разделе «Подключение оборудования»), после этого
необходимо использовать команды семейства lpr или spooler.
-
Если принтер подключен к последовательному
порту машины, то нужно использовать команды семейства lpr.
-
Если принтер подключен к параллельному порту
машины, то можно использовать как команды семейства lpr, так и утилиту spooler.
В этом случае
при работе программ распознавания устройств в момент
загрузки системы происходит автоматический запуск программы
spooler (см.
подразд. "Распознавание устройств" раздела 8). Конфигурационные файлы для большинства часто
используемых принтеров находятся в каталоге /etc/printers.
Если вы хотите использовать
семейство утилит lpr, то вам нужно настроить
конфигурационный файл принтера /etc/printcap.
-
Если используется
сетевой принтер или принтер, который присоединен к
параллельному порту другого узла, то
для работы с семейством утилит lpr необходимо использовать
сеть TCP/IP. Для печати на удаленных принтерах утилита spooler может работать
посредством Qnet, SAMBA, NCFTP или даже семейства утилит
lpr.
Для выполнения
удаленной печати необходимо изменить параметры настроек в
некоторых конфигурационных файлах в зависимости от того,
используются для печати семейство утилит lpr или утилита spooler.
Еще одно
отличие состоит в том, что сервис lpd управляет всеми
определенными в конфигурационном файле принтерами, в то
время как программа spooler управляет только одним
принтером, однако несколько экземпляров этой программы может
работать одновременно.
Печать с помощью утилиты lpr
Система печати lpr поддерживает:
-
работу нескольких принтеров;
-
несколько очередей спулинга;
-
печать как на локальном, так и на удаленном
принтере;
-
возможность подключения принтеров через
последовательный канал, для которого требуется
инициализация (например, установка скорости передачи в
бодах).
Для работы через систему
печати lpr необходимо иметь:
-
интерфейс пользователя и способ организации и
подготовки заданий на печать;
-
каталоги спулинга, т. е.
место для хранения файлов, ожидающих печати;
-
способ предотвращения неавторизованного
доступа;
-
программу сетевого администратора (для
удаленной печати), с помощью которой происходит передача
печатаемых файлов;
-
некоторые данные об используемом принтере.
Примечание. Для настройки системы lpr нужно войти в систему под
учетной записью root.
Интерфейс пользователя
В систему стандартной печати
входят следующие основные файлы и команды (рис. 14.1):
- lpd — сервис принтера, с
помощью которого и выполняется вся реальная работа;
-
lpr — программа
постановки в очередь задания на печать;
-
lprq — программа для
просмотра очереди спулера;
-
lprrm — программа для
удаления заданий из очереди;
-
lprc — программа для
управления принтерами и очередями спулера; эта утилита
доступна только пользователю с правами root;
Рис. 14.1. Печать
с помощью утилит семейства lpr
-
/etc/printcap — главная база
данных, где находятся описания принтеров,
непосредственно подключенных к машине и доступных через
сеть. В базе содержатся данные о доступных принтерах и
способе взаимодействия с ними, а также значения важных
параметров (например, местонахождение каталога спулинга
печати).
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 работает рекурсивно от
конца к началу, отображая очередь заданий для машины с
заданным принтером, а затем очереди машин, которые
направляют задания на данный принтер.
Имеется два формата
отображения выходной информации:
-
короткий формат (принят по умолчанию — на
каждое задание из очереди отводится одна строка вывода;
-
длинный формат (определяется с помощью ключа –l) — выводится
список и размеры файлов, составляющих задание.
lprrm —
удалить задания из очереди
Команда lprrm удаляет задания из очереди
спулера. При необходимости вначале по команде lprrm происходит уничтожение
процесса сервиса, обслуживающего очередь, а затем перезапуск
этого процесса после удаления указанных файлов. Если
удаляется задание, назначенное удаленному принтеру, то
команда lprrm работает так же, как и
команда lprq с одним исключением:
сначала проверяются удаляемые задания на локальной машине,
затем делается попытка удаления файлов из очереди,
находящихся на удаленных машинах.
Примечание. Из
очереди можно удалить только собственные задания на печать.
lprc — программа управления принтером
Программа lprc используется для управления
системой печати lpr. Для каждого принтера,
заданного в файле /etc/printcap, команда lprc может:
-
разрешить или запретить работу какого-нибудь
принтера;
-
разрешить или запретить работу очереди спулера
принтера;
-
изменить порядок заданий в очереди спулера;
-
получить информацию о статусе принтеров,
очередях спулеров и состоянии сервисов принтеров.
Программа lprc предоставляет пользователю
root возможность локального
управления принтерами. Далее приведен список основных команд
программы и их назначение. Подробное описание формата каждой
команды и полный список команд можно найти в руководстве
"Описание программы. Часть 1. Справочник по утилитам"
КПДА.10964-01 13 01.
-
start — разрешает печать
и передает программе lpd запрос на запуск
заданий на печать.
-
abort — немедленно
завершает работу активного сервиса спулера на локальной
машине, а затем запрещает печать (тем самым предотвращая
запуск командой lpr новых сервисов). Обычно
эта команда используется для принудительного перезапуска
зависшего сервиса принтера (например, в случае, когда
команда lprq сообщает, что сервис
запущен, но ничего не происходит).
Команда abort не удаляет из очереди спулера
каких-либо заданий на печать, для этого существует команда lprrm.
Например, вы
можете использовать команду disable при тестировании новых
фильтров принтера, поскольку при этом разрешается печать
пользователю root, но запрещается для всех
остальных пользователей. Другая распространенная ситуация
применения этой команды — запретить пользователям
помещать задания в очередь, если ожидается недоступность
принтера в течение длительного времени.
-
restart — обычным
пользователям разрешается перезапустить сервисы печати,
когда от программы lprq поступает сообщение об
отсутствии запущенных сервисов.
-
stop — команда
останавливает сервис печати после завершения текущего
задания. Эта команда также запрещает печать.
Использование этой команды является самым правильным
способом отключения принтера для проведения
техобслуживания. Имейте в виду, что при остановке
принтера этой командой пользователи по-прежнему имеют
возможность посылать задания в очередь спулера.
-
topq — команда
перемещает выбранные задания в начало очереди печати.
Эта команда может использоваться для продвижения на
печать приоритетных заданий (программа lpr помещает задания в
очередь в порядке их поступления).
Каталоги спулинга
Каждый узел, с которого может
производиться печать, должен иметь каталог спулинга, в
котором сохраняются файлы для печати. По умолчанию для этого
каталога назначается путь /usr/spool/output/lpd (этот путь может быть
изменен в файле /etc/printcap). Если этот каталог не
существует, его нужно создать для всех узлов.
Примечание. Сервис lpd не работает без каталога
спулинга и не выдает никаких сообщений об этом. Поэтому
весьма полезно при отладке проблем с принтером запускать
работу системного журнала (см. описание утилиты syslogd в руководстве "Описание
программы. Часть 1. Справочник по утилитам" КПДА.10964-01 13
01). Тогда вы сможете прочесть сообщения об ошибках в файле
/var/log/syslog.
Управление доступом
В системе управления
принтером организуются защищенные области спулинга, чтобы
пользователь не мог изменить относящиеся к принтеру учетные
данные или удалить файлы для печати, кроме собственных.
Правила, которые соблюдаются при этом, перечислены далее.
- Только сервис управления
печатью может помещать задания в спулер печати. Запись в
область спулинга могут производить только программы,
запущенные пользователем сервиса или группой сервиса.
-
Утилита lpr запускается с
идентификатором пользователя (root) и идентификатором
группы (daemon). При запуске от имени
root утилита lpr может читать любой
файл. Доступность файла проверяется путем вызова команды
access() (см. руководство по
библиотекам "Library Reference"). Идентификатор группы
используется для установки соответствующих прав доступа
на файлы в зоне спулинга для программы lprrm.
-
Пользователи не могут изменять управляющие
файлы. Управляющие файлы в области спулинга принадлежат
пользователю, от имени которого запущен спулер, или
группе daemon. Им соответствует режим
0660. Это дает гарантии
того, что пользователи не смогут изменить управляющие
файлы и что никакой пользователь не сможет удалить файлы
никаким способом, кроме применения утилиты lprrm.
-
Пользователи могут изменять файлы в каталоге
спулинга только с помощью утилит печати. Программы
работы со спулером (lpd, lprq и lprrm) для получения доступа
к файлам спулера и принтерам устанавливают бит setuid
для пользователя root и бит setgid для группы
daemon.
-
Управление локальным доступом к очередям
осуществляется через запись rg в файле /etc/printcap:
: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 — имя файла,
который нужно открыть для вывода;
-
br — скорость
передачи данных по линии терминала tty;
-
fs — флаги, которые
устанавливают параметры: CRMOD, без проверки четности,
XTABS;
-
tr=\f — печатать символ
подачи страницы (formfeed) при пустой очереди. Это
удобно, когда в принтер вставлена рулонная бумага. Тогда
по завершении задания на печать можно просто оторвать
бумагу вместо того, чтобы отключать принтер от линии и
вручную подавать бумагу;
-
of=/usr/lib/lpf — использовать для
печати файлов программу фильтрации с именем lpf (см.
разд. "Фильтры" далее в этом разделе);
-
lf=/usr/adm/lpd-errs — выводить все
сообщения об ошибках в файл /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,511 дюймов (т. е. 2127
см).
Для разрешения ведения учета
нужно добавить фильтр 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
В этом случае происходит
следующее.
-
Вы вводите команду lpr для выполнения печати
файла на удаленном принтере.
-
Утилита lpr отправляет запрос
службе печати.
-
Сервис lpd на узле node2 принимает запрос,
создает копию своего процесса для обслуживания запроса
на печать и создает подкаталог спулинга для хранения
печатаемых файлов.
-
Порожденный процесс сервиса lpd помещает в спулер
задание на печать в виде двух файлов: собственно
печатаемый файл данных и заголовочный файл, содержащий
информацию о задании на печать (она может быть
отпечатана в виде отдельной титульной страницы).
-
Порожденный процесс сервиса lpd производит обработку
заданий на печать, помещенных в спулер, в порядке их
поступления и начинает передачу пакетов данных с
заданиями на печать удаленному сервису lpd.
-
Сервис lpd на узле node1 принимает пакеты данных
как запросы на печать, проверяет, от разрешенного ли
узла поступил запрос, затем порождает копию своего
процесса для обслуживания запроса и создает подкаталог
спулинга для хранения печатаемых файлов (если запрос
поступает от неразрешенного узла, то в адрес источника
запроса отсылается сообщение об отказе).
-
Порожденный процесс сервиса lpd принимает пакеты
данных, помещая в очередь спулера сформированное задание
на печать, после чего задания на печать пересылаются на
указанный принтер в порядке их поступления.
Удаленная печать на принтер,
находящийся в другой сети
С помощью протокола 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, для выполнения
печати не требует подключения к какому-либо компьютеру. Все
запросы принтер обрабатывает самостоятельно. Поэтому для
работы с таким принтером необходимо проделать все те же шаги
по настройке, что описаны выше, со следующими небольшими
изменениями.
-
В файле /etc/hosts узла, с которого будет
производиться печать, нужно добавить запись с именем и
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
-
Из программы spooler на принтер выдается
запрос для определения его типа, создается файл свойств
данного принтера на основе системного файла общей
конфигурации принтера (см. далее) и сохраняется в
каталоге принтера на пути /dev.
-
После этого создается каталог спулинга:
/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, указав в качестве
параметра путь к вашему новому файлу конфигурации (в
нашем случае etc/printers/test.cfg) и имя необходимого
принтера (в нашем случае rlpt2). Строка запуска будет
выглядеть так:
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"). Если же не появляется
никаких сообщений об ошибках, то можно попробовать применить
приводимые ниже действия.
-
Несмотря на то, что порождаемая программа lpd создает подкаталоги
спулинга (что необходимо для сохранения задания для
печати), главный каталог спулинга должен создаваться
вами заранее. Проверьте еще раз, существует ли этот
каталог (по умолчанию его путь /usr/spool/output/lpd).
-
Проверьте на каждом узле содержимое файла /etc/printcap.
-
Убедитесь в том, что в файле /etc/hosts.lpd на узле, где происходит
печать, есть запись об узле, с которого отправляются
файлы на печать.
-
Если lpd еще не запущен, и
невозможно выполнить его запуск, необходимо проверить
существует ли файл блокировки
/usr/spool/output/lpd.lock. Если данный файл существует
и не запущен lpd
(например, после сбоя питания или падения системы), файл
необходимо удалить.
-
Убедитесь в том, что работает
программа сетевого администратора io-pkt* с соответствующими
разделяемыми объектами (библиотеками).
-
Запустите программу syslogd и просмотрите системные
сообщения в журнальном файле syslog.