Печать в Linux HOWTO (Linux Printing HOWTO) Grant Taylor , перевод Alex Ott ott@phtd.tpu.edu.ru v3.29, 9 марта 1999 Это Linux Printing HOWTO, набор информации о том как создавать, просматривать, печатать и отсылать по факсу все что угодно из под Linux (и в большинстве других Юниксов). ______________________________________________________________________ Table of Contents 1. Введение 1.1 История 1.2 Авторские права 2. Как печатать 3. Устройства печати в ядре Linux 3.1 Устройство lp (ядра <=2.1.32) 3.2 Устройство parport (ядра >= 2.1.33) 3.3 Последовательные устройства 4. Поддерживаемые принтера 4.1 Postscript 4.2 Non-Postscript 4.3 Какие принтера работают? 4.3.1 Список совместимых принтеров 5. Какое программное обеспечение используется для буферизации печати? 6. Как это работает, основы 7. Как настроить - основы 7.1 Традиционная настройка lpd 7.2 Права доступа на файлы 8. Где взять программное обеспечение для печати 9. Решения производителей 9.1 Red Hat 9.2 Debian 9.3 Другие дистрибутивы 10. Ghostscript 10.1 Обращение к Ghostscript 10.2 Настройка вывода Ghostscript 10.2.1 Расположение вывода и его размер 10.2.2 Гамма, размер точек и т.п. 11. Как печатать на сетевой принтер 11.1 На машину с Unix/lpd 11.1.1 С помощью 11.1.2 С помощью 11.2 На принтер Win95, WinNT, LanManager, или Samba 11.3 На принтер NetWare 11.4 На принтер EtherTalk (Apple) 11.5 На HP или другой ethernet-принтер 11.5.1 На старые принтера HP 11.6 Запуск 11.7 Из Windows 11.8 С Apple. 11.9 Из под Netware 12. Принтера предназначенные только для Windows 12.1 Ре-директор Ghostscript для Windows 12.2 Программа pbm2ppa 12.3 Программа pbm2l7k 13. Как печатать на факс-машину 13.1 Используя факс-модем 13.2 Используя удаленный сервис печати 14. Как генерировать что-то стоящее печати 14.1 Языки разметки 14.2 Текстовые процессоры с WYSIWYG 15. Экранный просмотр файлов для печати 15.1 PostScript 15.2 TeX dvi 15.3 Adobe PDF 16. Последовательные принтера под управлением lpd 16.1 Настройка printcap 16.2 Старые последовательные принтера и потеря символов 17. Credits ______________________________________________________________________ ППррииммееччааннииее ппееррееввооддччииккаа:: Шлите мне любый комментарии и замечания, даже небольшие. 11.. ВВввееддееннииее Printing HOWTO должно содержать все, что вам необходимо знать, чтобы помочь вам настроить сервисы печати на вашей Linux-системе. Как и жизнь, это немного сложнее чем мир "укажи и нажми" (the point-and- click) систем Microsoft и Apple, но это также является более гибкой вещью и определенно более легкой для администрирования в больших сетях (LANs). Этот документ организован так, что большинству людей будет необходимо прочитать только первую его половину. Большинство малоизвестной и ситуационо-зависимой информации расположено во второй половине документа и может быть легко найдено по содержанию, в то время как большинство информации в разделах 9 и 10 вероятно необходимо большому количеству людей. Начиная с версии 3.x документ полностью переписан и много информации из предыдущих версий утеряно. Это сделано с умыслом, так как предыдущие версии были настолько велики, что занимали 60 печатных страниц. Если вы не нашли здесь нужных ответов, вы можете: a) посмотреть предыдущую версию документа по адресу Домашняя страница Printing HOWTO b) послать мне замечание сообщающее о том, чему следовало здесь быть, но чего нет. Домашняя страница Printing HOWTO хорошее место, где можно найти последние версии документа; он также распространяется с MetaLab (metalab.unc.edu) и локальных зеркал LDP. 11..11.. ИИссттоорриияя Это третья редакция, т.е. третье полное переписывание Printing HOWTO (PHT). Хронологически история PHT может быть поделена следующим образом: 1. Я написал этот документ в 1992 в ответ на большое число вопросов о печати в группе новостей comp.os.linux, и разослал его. Это на несколько месяцев предшествовало проекту HOWTO и таким образом это был первый FAQ названный `howto'. Эта редакция была в формате plain ascii. 2. После присоединения к проекту HOWTO, Printing-HOWTO был соединен с Lpd FAQ Brian McCauley ; мы продолжали быть соавторами PHT примерно два года. В тоже время мы включили работу Karl Auer . Эта редакция PHT была в формате TeXinfo, и доступна в форматах PS, HTML, Ascii, и Info. 3. После примерно годового загнивания и распада PHT, и неудачных попыток делать что-нибудь кроме сопровождения документа, он был полностью переписан. Эта редакция PHT сделана в формате SGML, используя LinuxDoc DTD и пакет SGML-tools-1. Начиная с версии 3.27, в документ включена база данных поддерживаемых принтеров; до версии 3.27 в этом документе не было списка совместимости принтеров (!). 11..22.. ААввттооррссккииее ппрраавваа Авторскими правами на этот документ владеет Grant Taylor (c) 1992-1999. Свободно копируйте и распространяйте этот документ согласно терминам GNU General Public License, версии 2 или более поздней. 22.. ККаакк ппееччааттааттьь Если вы уже настроили lpd для печати на вашем принтере, или ваш системный администратор уже сделал это, или ваш поставщик сделал это для вас, то все что вам необходимо -- это научиться как использовать команду lpr. Printing Usage HOWTO делает обзор этого и вы должны знать еще несколько других команд манипуляции очередью печати. Однако если у вас новая машина или новый принтер, вам необходимо будет настроить сервисы печати одним или другим способом до того как вы сможете печатать. Читайте! 33.. УУссттррооййссттвваа ппееччааттии вв яяддррее LLiinnuuxx Существует два полностью отличающихся драйвера устройства для параллельного порта; что вы используете, зависит от версии ядра. Драйвер изменен в Linux версии 2.1.33. Несколько деталей одинаковы для обоих типов драйвера. Скорее всего, много людей обнаружат, что Linux не обнаруживает параллельного порта, до тех пор пока они не запретят "Plug and Play" в их PC BIOS. (это не является сюрпризом; отслеживание данных о PnP не-PCI устройствах в Windows и где-нибудь еще могут быть чем-то вроде бедствия). 33..11.. УУссттррооййссттввоо llpp ((яяддрраа <<==22..11..3322)) Ядро Linux (<=2.1.32), предполагает, что вы вкомпилировали в ядро или загрузили модуль устройства lp (вывод команды cat /proc/devices должен включать устройство lp, если оно загружено), обеспечивая одно или больше устройств: _/_d_e_v_/_l_p_0, _/_d_e_v_/_l_p_1, и _/_d_e_v_/_l_p_2. Они не присваиваются динамически, каждое соответствует специфическому адресу ввода/вывода вашего оборудования. Это означает, что ваш первый принтер может быть _l_p_0 или _l_p_1 в зависимости от вашего оборудования. Просто попробуйте оба. Некоторые пользователи сообщили, что их двунаправленные lp порты не определяются, если они использовали старые однонаправленные кабеля. Проверьте, что вы используете нужный кабель. Некоторые люди не могут запустить драйвера plip и lp в одно и тоже время на любом заданном порту (в любом случае под 2.0). Однако вы можете загрузить тот или иной драйвер вручную или с помощью kerneld для версий 2.x (и позже 1.3.x) в заданное время. При правильной установке прерываний и подобных вещей, вы по идее можете запустить plip на одном порту, а lp на другом. Некоторые люди делали это редактированием исходного текста драйверов; я с нетерпением ожидаю сообщение о том, что кто-то сделал это только с помощью правильной командной строки. Существует маленькая утилита, названная tunelp, предназначенная для того, чтобы вы, как администратор, могли настроить для устройств lp Linux 2.0 используемые прерывания, скорость опроса и прочие опции. Если драйвер встроен в ядро, то ядро может воспринимать опцию lp= для установки прерываний и адресов ввода/вывода: Когда драйвер lp встроен в ядро, вы можете использовать командную строку LILO/LOADLIN для установки адресов портов и прерываний, которые будет использовать драйвер. Синтаксис: lp=port0[,irq0[,port1[,irq1[,port2[,irq2]]]]] Например: lp=0x378,0 or lp=0x278,5,0x378,7 ** Заметим, что если вы используете это свойство, вы должны указать *все* порты, которые вы хотите учитывать, значений по умолчанию не существует. Вы можете запретить встроенные драйвер с помощью опции lp=0. Когда драйвер загружен как модуль, то возможно указать адреса ввода/вывода и прерывания в командной строке программы insmod (или в файле _/_e_t_c_/_c_o_n_f_._m_o_d_u_l_e_s, при использовании kerneld) используя обычный синтаксис. Параметры следующие: io=port0,port1,port2 и irq=irq0,irq1,irq2. Прочитайте справочную страницу для команды _i_n_s_m_o_d для более детальной информации об этом. **Для тех из вас, кто (подобно мне) никогда не может найти номера стандартных портов когда это нужно, я привел два примера выше. Номер другого порта (для _l_p_0) равен 0x3bc. У меня нет никаких идей о том какое прерывание обычно используется. Исходный код для драйвера параллельного порта Linux 2.0 находится в файле /usr/src/linux/drivers/char/lp.c. 33..22.. УУссттррооййссттввоо ppaarrppoorrtt ((яяддрраа >>== 22..11..3333)) Начиная с ядра 2.1.33 (и доступно как заплатка к ядру 2.0.30), устройство lp является просто клиентом нового устройства parport. Добавление устройства parport исправляет некоторое количество проблем, которые были из-за старого устройства lp - оно может разделять порты с другими устройствами, оно динамически присваивает доступные параллельные порты номерам устройств, вместо использования фиксированных соотношений между адресами ввода/вывода и номером порта, и так далее. Введение устройства parport позволило создать целую группу новых драйверов параллельного порта для устройств подобных дискам Zip, Backpack CD-ROM и дискам, и так далее. Некоторые из них доступны в ядрах версии 2.0; посмотрите в интернете. Главное отличие, которое вы отметите, в том, что ядра, основанные на parport динамически присваивают устройства lp для параллельных портов. Так что, то что было lp1 в Linux 2.0 может оказаться lp0 в Linux 2.2. Убедитесь, что вы проверили это если вы делаете обновление с ядра, работающего с драйвером lp на ядро с драйвером parport. Я сделаю обозрение устройства parport более полным, когда я сам столкнусь с ним, но пока вы для информации можете прочитать файл Documentation/parport.txt в исходных текстах ядра, или посмотреть на сервере parport . 33..33.. ППооссллееддооввааттееллььнныыее ууссттррооййссттвваа Последовательные устройства под Linux называются подобно _/_d_e_v_/_t_t_y_S_1. Утилита stty позволит вам интерактивно просмотреть или установить параметры последовательного порта setserial позволит вам контролировать некоторые расширенные атрибуты и настроить IRQ и адреса ввода/вывода для нестандартных портов. Дополнительные обсуждения последовательных портов в Linux вы можете найти в Serial-HOWTO . При использовании медленных последовательных принтеров с контролем потока, вы можете обнаружить, что некоторые из ваших заданий оборваны. Это может быть из-за последовательного порта, чье действие по умолчанию -- удалить любые не переданные символы из своего буфера через 30 секунд после того как устройство закрыто. Буфер может содержать до 4096 символов, и если ваш принтер использует контроль потока и медлен настолько, что не может принять все данные из буфера за 30 секунд после того как программа печати закрыла последовательный порт, то конец содержимого буфера будет потерян. Если команда cat file > /dev/ttyS2 делает полный печатный вывод для коротких файлов, но обрезает длинные файлы, то у вас может быть такая проблема. 30-ти секундный интервал может быть выравнен с помощью опции "closing_wait" командной строки программы setserial (версии 2.12 и поздних). Последовательные порты машины обычно инициализируются вызовом setserial в загрузочном файле rc.serial. Вызов для последовательного порта принтера может быть модифицирован для установки параметра closing_wait вместе с установкой других параметров. 44.. ППооддддеерржжииввааееммыыее ппррииннттеерраа Ядро Linux в основном поддерживает любой принтер, который вы можете подключить к последовательному или параллельному порту, но существуют такие принтера, которые вы не можете использовать, даже если они могут быть подключены к машине и общаться (на электрическом уровне) с Linux. Основными среди этих несовместимых принтеров являются принтера, на которые ссылаются как на принтера "Windows" или "GDI". Они так называются, потому-что часть или есть язык управления принтером и детали проектирования механизма печати не документированы. Обычно производитель предоставляет драйвер для Windows и спокойно продает принтера только для пользователей Windows; Это почему они называются Winprinters. В некоторых случаях производитель также предоставляет драйвера для NT, OS/2, или других операционных систем. Многие из этих принтеров _н_е _р_а_б_о_т_а_ю_т с Linux. Некоторые из них работают, и некоторые из них работают чуть-чуть (обычно потому-что кто-то сделал исследование деталей, необходимых для написания драйвера). Смотрите список поддерживаемых принтеров, приведенный ниже, для подробностей о нужном принтере. Некоторые принтера находятся в промежутке между крайностями. Некоторые модели NEC, например, реализуют простую форму стандартного языка принтера PCL, что позволяет работающему с PCL программному обеспечению печатать на них до разрешения 300dpi, но только NEC знает как получить разрешение 600dpi на этих принтерах. Заметим, что если вы уже имеете один из таких Winprinters, то существует окольный путь, чтобы заставить печать Linux на них, но он достаточно неудобный и я никогда не пробовал применять сам. Смотрите раздел 12 этого документа, для более детального обсуждения принтеров, работающих только с Windows. 44..11.. PPoossttssccrriipptt Среди принтеров, которые _р_а_б_о_т_а_ю_т с Linux, лучшим выбором является покупка принтера со встроенной поддержкой PostScript. Почти все программное обеспечение в Unix, которое производит печатный вывод делает это в формате PostScript, так что очевидно будет хорошо иметь принтер, который сразу поддерживает PostScript. К сожалению поддержка PostScript является редкой за пределами области лазерных принтеров. Программное обеспечение для Unix, и индустрия печати в общем, стандартизировали Postscript как язык управления принтером. Это случилось по нескольким причинам: ССииннххррооннииззаацциияя ((TTiimmiinngg)) Postscript возник как часть Apple Laserwriter, великолепного компаньона для компьютеров Macintosh и принтера наилучшим способом отвечающим революции настольных издательских систем в 80-х годах. ООнн ннееззааввииссиимм оотт ууссттррооййссттвваа Программы на Postscript могут быть запущены для создания вывода на растровые и векторные дисплеи, на на fax-машины, или почти на любой тип принтеров без необходимости изменения исходной программы. Изображение в Postscript будет одним и тем же на любом устройстве postscript, по крайней мере в пределах обеспечиваемых свойствами принтера. До создания формата PDF, люди обменивались сложными документами в виде файлов Postscript. Единственная причина того, что стандарт не прижился, заключается в том, что машины с Windows обычно не включали средства просмотра Postscript, так что Adobe специфицировала гиперсвязи и сжатие для формата Postscript, назвала резальтат PDF, и распространяет средства просмотра для этого формата, и создала рынок для своих утилит "distiller". (функциональность которых также обеспечиваются программами ps2pdf и pdf2ps из пакета ghostscript). ЭЭттоо ннаассттоояящщиийй яяззыыкк ппррооггррааммммиирроовваанниияя Postscript это полномасштабный язык программирования; вы можете писать на нем программное обеспечение почти для любых дел. Это в основном полезно для определения подпрограмм в начале вашей программы для повторения сложных вещей во всем вашем документе, таких как знак логотипа или слова "DRAFT", написанного большими буквами в качестве фона для страницы. ООнн яяввлляяееттссяя ооттккррыыттыымм Postscript полностью специфицирован в общедоступной серии книг (которые вы можете найти в любом хорошем книжном магазине). Хотя Adobe изобрела его и обеспечивает доминирующую коммерческую реализацию этого языка, другие производители, такие как Aladdin также производят независимую реализацию Postscript. 44..22.. NNoonn--PPoossttssccrriipptt При недостатке бюджета, необходимого чтобы купить PostScript принтер, вы можете использовать любой принтер поддерживаемый программой Ghostscript, свободным интерпретатором PostScript используемый вместо настоящей поддержки PostScript принтером. Домашняя станица Ghostscript имеет список поддерживаемых принтеров и информацию о статусе новых и экспериментальных драйверов. Заметим, что эта страница перечисляет принтера поддерживаемые в последней версии Ghostscript, в то время как большинство дистрибутивов Linux могут предлагать довольно устаревшую версию Ghostscript из-за применяемой лицензии. К счастью обычно существуют пакеты с новыми версиями Ghostscript в разделе contrib каждого дистрибутива. Пожалуйста помогите улучшить страницу поддержки принтеров Ghostscript, посылая сообщения о ваших успехах и неудачах. В настоящее время Adobe имеет новый язык для принтеров называемый "PrintGear". Я думаю, что это сильно упрощает язык в двоичном формате с некоторыми свойствами PostScript, но без совместимости с PostScript. И я не слышал, что Ghostscript поддерживает его. Но некоторые принтера с PrintGear могут поддерживать другие языки, подобные PCL, и эти принтера будут работать с Linux.(если в принтере реализован PCL, а не в драйвере Windows). 44..33.. ККааккииее ппррииннттеерраа ррааббооттааюютт?? Если вы хотите купить принтер, то вы можете посмотреть в нескольких местах информацию о том, будет ли он работать. Назначение базы данных принтеров Printing HOWTO --- быть полным списком состояния поддержки принтера в Linux. Краткое содержимое этой базы приведено ниже; убедитесь, что вы проверили интерактивную версию базы данных для дополнительной информации о принтере и информации о том, какой драйвер необходимо использовать. Страница совместимости с принтерами Ghostscript содержит список некоторых работающих принтеров, так же как и ссылки на другие страницы. Также Dejanews содержит сотни сообщений типа "это работает" и "это не работает". Попробуйте все деревья сообщений, и если ничего не получилось, то проверьте, что ваш принтер содержится и правильно описан в базе данных , так что он будет правильно перечислен в этом документе в следующих версиях. 44..33..11.. ССппииссоокк ссооввммеессттииммыыхх ппррииннттеерроовв Этот раздел является обобщением интерактивной версии. Интерактивная версия включает основные спецификации, замечания, ссылки на информацию о драйверах, сопровождаемую пользователем информацию, ссылки на сервера производителя и тому подобное. Интерактивная версия этого списка также позволяет пользователям добавлять принтера, так что будьте уверены, что проверили ее. В конце концов, если принтер не перечислен в списке, то добавьте его! listed, add it! Принтера разделены на три типа: ООттллииччнноо Отличные принтера и работают отлично -- вы можете использовать все возможности принтера, включая цвет, полное разрешение и т.п. В некоторых случаях принтера с недокументированными "увеличениями разрешения", которые не работают, все равно перечислены как отличные; в основном различие в качестве печати достаточно слабое, так что вы можете не беспокоится об этом. ХХоорроошшоо ((ннееббооллььшшииее ооггррааннииччеенниияя)) Вы можете нормально печатать, но существуют небольшие ограничения, того или иного сорта либо в печати, либо в других свойствах. ЧЧаассттииччнноо Вы можете печатать, но может быть не в цвете, или только с низким разрешением. Смотрите колонку примечаний списка для информации о характере ограничений. ББааллллаасстт Вы не можете печатать; обычно это происходит из-за отсутствия драйвера и/или документации о том, как его написать. В любом случае, поскольку эта информация предоставлена массой людей, никто не гарантирует, что она правильная. Однако, информация может быть легко подтверждена поиском информации на страницах о драйверах принтера и серверах производителя. И без лишней суеты, вот список совместимости принтеров: BBrrootthheerr ООттллииччнноо HL-10V, HL-660, HL-720, HL-760. ХХоорроошшоо ((ннееббооллььшшииее ооггррааннииччеенниияя)) HL-1050. CCaannoonn ООттллииччнноо BJ-10e, BJ-20, BJ-200, BJC-210, BJC-240, BJC-250, BJC-610, BJC-620, BJC-70, BJC-800, LBP-8II, LIPS-III. ХХоорроошшоо ((ннееббооллььшшииее ооггррааннииччеенниияя)) BJ-300, BJC-4000, BJC-4100, BJC-4200, BJC-4300, BJC-4400, BJC-7000, BJC-7004. ЧЧаассттииччнноо BJC-4550, MultiPASS C2500, MultiPASS C3500. ББааллллаасстт BJC-5000, LBP-460, LBP-660. EEppssoonn ООттллииччнноо ActionLaser 1100, LP 8000, LQ 850, Stylus Color, Stylus Color 400, Stylus Color 500, Stylus Color 600, Stylus Color 640, Stylus Color 850, Stylus Color II, Stylus Color IIs, Stylus Pro XL. ХХоорроошшоо ((ннееббооллььшшииее ооггррааннииччеенниияя)) Stylus Color 800, Stylus Photo 750. ЧЧаассттииччнноо Stylus Color 740. HHPP ООттллииччнноо 2000Cse, 2500C, DesignJet 650C, DeskJet 1200C, DeskJet 1600C, DeskJet 1600Cm, DeskJet 400, DeskJet 420C, DeskJet 500, DeskJet 550C, DeskJet 600, DeskJet 660Cse, DeskJet 690C, DeskJet 850C, DeskJet 855C, DeskJet 870, DeskJet 870Cxi, DeskJet 890, LaserJet 1100, LaserJet 2100, LaserJet 2100M, LaserJet 4000N, LaserJet 4L, LaserJet 5, LaserJet 5L, LaserJet 5MP, LaserJet 6L, LaserJet 6MP, LaserJet 8000, LaserJet 8100, Laserjet 5000, Mopier 320, PaintJet XL300. ХХоорроошшоо ((ннееббооллььшшииее ооггррааннииччеенниияя)) HP 660C. ЧЧаассттииччнноо DeskJet 1000C, DeskJet 670C, DeskJet 710, DeskJet 720C, DeskJet 722C, DeskJet 820C. ББааллллаасстт LaserJet 3100. IIBBMM ООттллииччнноо Jetprinter 3852. LLeexxmmaarrkk ООттллииччнноо Optra Color 1200, Optra Color 1275, Optra Color 40, Optra Color 45, Optra E, Optra E+, Optra Ep, Optra S 1250. ЧЧаассттииччнноо 1020 Business, 3000, 5700, 7000. ББааллллаасстт 1000, 1020, 1100, 2030, 2050, 2070, 5000, 7200, Winwriter 100, Winwriter 150c, Winwriter 200. MMiinnoollttaa ООттллииччнноо PagePro 6, PagePro 8. NNEECC ООттллииччнноо P2X. ЧЧаассттииччнноо SuperScript 100C, SuperScript 1260, SuperScript 150C, SuperScript 650C, SuperScript 750C, SuperScript 860, SuperScript 870. ББааллллаасстт SuperScript 660i, SuperScript 660plus. OOkkiiddaattaa ООттллииччнноо OL 410e, OL 610e/PS, OL 810e/PS, Okipage 6e, Okipage 6ex, Okipage 8c. ХХоорроошшоо ((ннееббооллььшшииее ооггррааннииччеенниияя)) Okipage 4w. ББааллллаасстт Okipage 8w, okijet 2010. OOlliivveettttii ООттллииччнноо JP350S. PPaannaassoonniicc ООттллииччнноо KX-P1123, KX-P4440, KX-P5400, KX-P8420, KX-P8475. ЧЧаассттииччнноо KX-P6500. ББааллллаасстт KX-P6100, KX-P8410. QQMMSS ООттллииччнноо 2425 Turbo EX. RRiiccoohh ООттллииччнноо 4801, 6000. XXeerrooxx ООттллииччнноо DocuPrint C55, DocuPrint N17, DocuPrint N32. 55.. ККааккооее ппррооггррааммммннооее ооббеессппееччееннииее ииссппооллььззууееттссяя ддлляя ббууффееррииззааццииии ппееччааттии?? До недавнего времени выбор для пользователей Linux был очень прост -- каждый запускал тот же самый старый lpd, который был почти дословно перенесен из кода BSD Net-2. Даже сегодня большинство продавцов продает это программное обеспечение. Но ситуация начинает меняться. Системы подобные SVR4, включая Sun Solaris, идут с полностью отличающимся пакетом печати, сконцентрированным вокруг lpsched. И есть сообщения, что многие продавцы Linux начинают обеспечивать LPRng, менее древнюю реализацию системы печати, которая свободно доступна. LPRng более легок для администрирования в больших сетях (читайте: больше чем один принтер, любые последовательные принтера, или любые специфические не-lpd сетевые принтера) и менее бессистемен в своей основе, чем lpd. Он может даже быть честно объявлен как безопасный -- больше нет исполняемых файлов с установленным SUID, и также он поддерживает авторизацию через PGP или Kerberos. В настоящий момент, даже в свете новых вариантов, lpd вероятно лучше для большинства пользователей Linux. Хотя она не является шикарнейшей системой, она работает хорошо после установки и она хорошо понимаемая и хорошо документирована в книгах по Unix. Если вы хотите узнать больше информации о LPRng, посмотрите на LPRng - An Enhanced Printer Spooler . Будущие версии этого документа будут включать информацию о использовании и LPRng и обычного lpd. 66.. ККаакк ээттоо ррааббооттааеетт,, ооссннооввыы Для того чтобы печать работала хорошо, вам необходимо понять как работает система lpd. Lpd обозначает Line Printer Daemon (демон линейной печати), и ссылается в разных контекстах и на программу-демона и на весь набор программ которые работают с системой печати. Это: lpd Демон системы печати. Один из них работает для контроля действий на машине, И запускается один на каждый принтер пока принтер печатает. lpr Пользовательская команда печати. Lpr контактирует с lpd и выдает новое задание печати в очередь печати. lpq Перечисляет задания в очереди печати. lpc Команда контроля системы lpd. С помощью lpc вы можете останавливать, начинать, переупорядочивать и т.п. очереди печати. lprm lprm удаляет задание из очередей печати. Теперь как это работает вместе? Когда система загружается, стартует процесс под названием lpd. Он сканирует файл /etc/printcap чтобы узнать какие принтера он будет обслуживать. Каждый раз при запуске lpr, lpr контактирует с lpd через именованный сокет _/_d_e_v_/_p_r_i_n_t_e_r, и передает lpd и файл для печати и некоторую информацию о том кто печатает и как печатать файл. Затем lpd печатает файл на соответствующем принтере в порядке очереди. Система lp была спроектирована когда большинство принтеров было линейными принтерами -- так что люди в большинстве печатали чистый ascii. Как показало время, только небольшое добавление было необходимо чтобы заставить lpd работать довольно хорошо с заданиями сегодняшнего дня, которые часто идут в формате PostScript, или текст, или dvi, или.. 77.. ККаакк ннаассттррооииттьь -- ооссннооввыы 77..11.. ТТррааддииццииооннннааяя ннаассттррооййккаа llppdd Традиционная настройка lpd заканчивается тем, что можно создавать очереди файлов и печатать их. Она не обращает никакого внимания на то понимает ли принтер эти файлы или нет, и скорее всего не позволит производить привлекательный вывод. Тем не менее, это первый шаг к пониманию, так что читайте! Для добавления очереди печати к lpd, вы должны добавить запись в файл _/_e_t_c_/_p_r_i_n_t_c_a_p, и создать новую буферную директорию в каталоге_/_v_a_r_/_s_p_o_o_l_/_l_p_d. Запись в файле _/_e_t_c_/_p_r_i_n_t_c_a_p выглядит примерно так: # ЛОКАЛЬНЫЙ djet500 lp|dj|deskjet:\ :sd=/var/spool/lpd/dj:\ :mx#0:\ :lp=/dev/lp0:\ :sh: Это определяет принтер называемый _l_p, _d_j, или _d_e_s_k_j_e_t, его спул размещается в директории _/_v_a_r_/_s_p_o_o_l_/_l_p_d_/_d_j, без ограничения максимального размера задания, который печатает на устройство _/_d_e_v_/_l_p_0, и который не имеет страницу с заголовком (с именем человека, который печатает и т.п. информацией) добавленную в начало задания печати. Теперь прочитайте справочную страницу для _p_r_i_n_t_c_a_p. Вышеприведенный пример выглядит очень простым, но он имеет ловушку -- хотя я посылаю файлы, которые DeskJet 500 может понимать, этот DeskJet будет печатать странные вещи. Например посыл обычного текстового файла Unix приведет к тому, что deskjet будет интерпретировать символы новой строки как символы, и выдаст мне: This is line one. This is line two. This is line three. Печать файла PostScript на этот принтер выдаст великолепный листинг команд PostScript, напечатанных с этим "лестничным эффектом", а не полезный вывод. Очевидно требуется что-то сделать, и это является назначением фильтрации. Более наблюдательные из тех кто читал справочную страницу printcap должны были заметить атрибуты принтера _i_f и _o_f. Хорошо, _i_f, или входной фильтр -- это все что нам нужно здесь. Если мы напишем маленький скрипт, названный _f_i_l_t_e_r, который добавляет возврат каретки до символа новой строки, то лестничный эффект будет ликвидирован. Так что мы добавим строку _i_f в нашу, вышеприведенную запись в printcap: lp|dj|deskjet:\ :sd=/var/spool/lpd/dj:\ :mx#0:\ :lp=/dev/lp0:\ :if=/var/spool/lpd/dj/filter:\ :sh: Простой скрипт может выглядеть так: #!perl # Предыдущая строка должна содержать полный путь к perl # Скрипт должен быть исполнимым: chmod 755 filter while(){chop $_; print "$_\r\n";}; # Вы можете также добавить в конец прогон страницы: print "\f"; Если мы сделаем как приведено выше, мы будем иметь принтер на котором мы сможем печатать обычные текстовые файлы Unix и получать осмысленные результаты. (Конечно мы можем написать этот фильтр четырьмя миллионами лучших способов, но этот более иллюстративный. Вы можете попытаться сделать это более эффективно). Оставшаяся проблема в том что печать простого текста не является злободневной -- наверняка будет лучше если мы сможем печатать PostScript и другие типы форматированого и графического вывода. Да и это легко сделать. Метод является просто расширением вышеприведенного фильтра для исправления перевода строки. Если вы напишите фильтр, который может воспринимать произвольные типы файлов как ввод и производить вывод для DeskJet для каждого случая, тогда мы безусловно получим "умный" спулер принтера. Такой фильтр называется _m_a_g_i_c-фильтр. Не беспокойте себя написанием фильтра, до тех пора пока они не будут печатать странные вещи -- в сети уже существует много хорошо написанных фильтров. APS Filter это лучший среди всех, или ваш дистрибутив Linux может иметь утилиту настройки принтера, которая сделает всю настройку очень простой. 77..22.. ППрраавваа ддооссттууппаа ннаа ффааййллыы По популярному требованию, я включил ниже список прав доступа на интересующие нас файлы на моей системе. Существует несколько более лучших способов сделать это, в идеале использовать только выполнимые файлы со SGID и не делать все подряд SUID root, но это как пришло в моей системе, и это работает для меня. (Довольно откровенно, если ваш производитель даже не может сделать работающий lpd, то вы в опасной поездке). -r-sr-sr-x 1 root lp /usr/bin/lpr* -r-sr-sr-x 1 root lp /usr/bin/lprm* -rwxr--r-- 1 root root /usr/sbin/lpd* -r-xr-sr-x 1 root lp /usr/sbin/lpc* drwxrwxr-x 4 root lp /var/spool/lpd/ drwxr-xr-x 2 root lp /var/spool/lpd/lp/ В настоящее время lpd должен быть запущен под правами администратора, так что он может быть связан с сервисным портом lp с низким номером. Он должен вероятно быть с UID lp.lp или каким-то после связывания, но я не знаю с каким. 88.. ГГддее ввззяяттьь ппррооггррааммммннооее ооббеессппееччееннииее ддлляя ппееччааттии Много написанных пакетов фильтров (и другого программного обеспечения относящегося к печати) доступно с MetaLab . Такие утилиты как psutils, a2ps, mpage, dvitodvi, flpr и т.п. все могут быть найдены там. В настоящее время существует несколько пакетов, которые старались сделать настройку принтера более легкой. Они вероятно все еще существуют, но лучший из них и более современный это пакет APS Filter, написанный Andreas Klemm, который имеет управляемый меню настройщик printcap и обрабатывает практически любой тип вообразимого ввода. Если ваш поставщик не поставил вам хорошую утилиту настройки принтера, то APS Filter это правильный путь решения проблем. 99.. РРеешшеенниияя ппррооииззввооддииттееллеейй Этот раздел по определению неполный. Свободно посылайте мне детальную информацию о вашем любимом дистрибутиве. 99..11.. RReedd HHaatt Red Hat имеет утилиту администрирования принтера с GUI-интерфейсом, которая может добавлять удаленные принтера и принтера на локальных устройствах. Она позволяет вам выбрать поддерживаемый ghostscript тип принтера и устройство Unix на которое будет производиться печать, затем устанавливает очередью печати в файл _/_e_t_c_/_p_r_i_n_t_c_a_p и создает короткий magic-фильтр для PostScript-и-ascii основанный на gs и nenscript. Это решение работает довольно хорошо, и оно тривиально в установке для общих случаев. Red Hat может дать сбой, если у вас принтер, который не поддерживается Ghostscript, который идет в его поставке, (он является GNU версией, а не версией Aladdin Ghostscript, которая поддерживает большее количество принтеров). Посмотрите список совместимости принтеров, приведенный выше (или по адресу online ), в том случае если вы обнаружили, что вы не можете печатать правильно, используя программное обеспечение, предоставленное Red Hat. Если ваш принтер не поддерживается утилитами Red Hat, то вы можете установить Aladdin Ghostscript, и вероятно будет лучше, если вы будете использовать пакет apsfilter, который имеет все сведения о принтерах, поддерживаемых последними версиями Ghostscript. 99..22.. DDeebbiiaann Debian предлагает выбор между обычным lpd и LPRng; вероятно LPRng будет наилучшим выбором. Я верю, что Debian также предлагает выбор утилит для настройки принтера; пакет apsfilter версии 5 или более поздней вероятно будет лучшим выбором, поскольку в этих версиях добавлена поддержка LPRng и драйверов uniprint Ghostscript. 99..33.. ДДррууггииее ддииссттррииббууттииввыы Пожалуйста посылайте мне информацию о том сто имеется в других дистрибутивах. 1100.. GGhhoossttssccrriipptt GhostscriptЭто невероятно важная программа для печати в Linux. Большинство печатающего программного обеспечения под Unix генерирует PostScript, поддержка которого принтером обходится примерно в $100 долларов на каждый принтер. Тем не менее Ghostscript, является свободным и генерирует вывод на языке вашего принтера из PostScript. Когда он связан с входным фильтром вашего lpd, это дает вам виртуальный PostScript-принтер и значительно упрощает жизнь. Ghostscript доступен в двух формах. Коммерческая версия Ghostscript, называемая Aladdin Ghostscript, mможет быть использована свободно для персонального использования, но не может распространяться с коммерческими дистрибутивами Linux. В общем она примерно на год впереди свободной версии Ghostscript; в настоящее время, например, она поддерживает много цветных струйных принтеров, в то время как старый Ghostscripts не делает этого. Свободная версия Ghostscript называется GNU Ghostscript, и это просто устаревшая версия Aladdin Ghostscript любезно предоставленная для GNU. (Спасибо славному Aladdin за эту договоренность; больше производителей программного обеспечения должны поддерживать свободное программное обеспечение этим способом, если они не могут сделать распространение кода в терминах GPL). Что бы вы не делали с gs, будьте уверены что запускаете его с опцией запрещающей доступ к файлам (-dSAFER). PostScript это полнофункциональный язык, и плохая программа на PostScript может доставить вам достаточно неприятностей. Честно говоря разговор на PDF, (Формате Переносимого Документа Adobe) это в действительности чуть больше чем организованный PostScript в сжатом файле. Ghostscript может обрабатывать ввод в PDF также как это делает с PostScript. Так вы можете быть первым в вашем квартале с принтером имеющим возможность обработки PDF. 1100..11.. ООббрраащщееннииее кк GGhhoossttssccrriipptt Обычно ghostscript будет запускаться magic-фильтром, которым вы пользуетесь (Я рекомендую пакет apsfilter, если ваш поставщик не поставил вам этот пакет), но для целей отладки очень часто удобно запускать его прямо. gs -help даст вам коротки, информативный список опций и доступных драйверов (заметим, что этот список является списком вкомпилированных драйверов, не основным списком доступных драйверов). Вы можете запустить gs для тестирования примерно так: gs _o_p_t_i_o_n_s -q -dSAFER -sOutputFile=/dev/lp1 test.ps. 1100..22.. ННаассттррооййккаа ввыыввооддаа GGhhoossttssccrriipptt Существует набор вещей которые вы можете сделать если вывод gs не удовлетворителен (пожалуйста вы можете латать что угодно, поскольку вы имеете исходные тексты). 1100..22..11.. РРаассппооллоожжееннииее ввыыввооддаа ии ееггоо ррааззммеерр Расположение, размер и коэффициент сжатия изображения на странице контролируются принтер-специфичным драйвером в ghostscript. Если вы обнаружили, что ваши страницы получаются слишком короткими, или слишком длинными или со слишком большим фактором увеличения, вы можете посмотреть в исходный код модуля драйвера и выровнять необходимые для вас параметры. К сожалению каждый драйвер написан по разному, так что я не могу сказать что исправлять, но большинство из них довольно неплохо прокоментированы. 1100..22..22.. ГГааммммаа,, ррааззммеерр ттооччеекк ии тт..пп.. Большинство не лазерных принтеров страдают от факта, что их точки немного больше. В результате картинки получаются слишком темными. Если вы страдаете от этой проблемы, то вы должны использовать свою собственную функцию переноса. Просто создайте следующий файл в директории lib ghostscript и добавьте его имя в вызов gs перед именем нужного файла. Вам может быть необходимо поиграть со значениями для настройки на ваш принтер. Более низкие значения дают более яркую печать. Особенно если ваш драйвер использует алгоритм Floyd-Steinberg для растеризации цветов, то более низкие значения (0.2 - 0.15) вероятно будут хорошим выбором. ---8<---- gamma.ps ----8<--- %! %transfer functions for cyan magenta yellow black {0.3 exp} {0.3 exp} {0.3 exp} {0.3 exp} setcolortransfer ---8<------------------8<--- Также возможно чинить принтера, которые имеют некоторый сорт проблем с цветом с помощью подбора значений указанных выше. Если у вас есть такая проблема, я рекомендую вам использовать файл colorcir.ps, который идет вместе с ghostscript (в поддиректории examples/), как тестовую страницу. Для многих драйверов современных струйных принтеров существуют опции командной строки, или отдельный файлы upp для драйверов, которые реализуют изменения гаммы и других параметров и адаптируют принтер для разных типов бумаги. Вы должны заглянуть в них, до экспериментирования с Postscript, для того чтобы исправить проблемы. 1111.. ККаакк ппееччааттааттьь ннаа ссееттееввоойй ппррииннттеерр Одним из свойств lpd является то что он поддерживает печать по сети на принтер, физически подключенный к другой машине. С помощью правильной комбинации фильтров и разнообразных утилит, вы можете сделать печать через lpr прозрачно на принтера во всех видах сетей. 1111..11.. ННаа ммаашшииннуу сс UUnniixx//llppdd Для того чтобы разрешить удаленным машинам печатать на ваш принтер, вы должны перечислить эти машины в файле _/_e_t_c_/_h_o_s_t_s_._e_q_u_i_v или _/_e_t_c_/_h_o_s_t_s_._l_p_d. (Заметим, что _h_o_s_t_s_._e_q_u_i_v имеет список машин несколько с другим эффектом; будьте уверены что вы знаете что вы делаете если перечисляете машины в этом файле). Вы можете разрешить только определенным пользователям на других машинах печатать на ваш принтер используя атрибут _r_s; читайте справочную страницу lpd для более детальной информации об этом. 1111..11..11.. СС ппооммоощщььюю llppdd Для того чтобы печатать на другую машину вы должны сделать примерно такую запись в _/_e_t_c_/_p_r_i_n_t_c_a_p: # Удаленный djet500 lp|dj|deskjet:\ :sd=/var/spool/lpd/dj:\ :rm=machine.out.there.com:\ :rp=printername:\ :lp=/dev/null:\ :sh: Заметим что все равно есть директория очереди на локальной машине обслуживаемая lpd. Если удаленная машина занята или отключена, то задание с локальной машины будет находиться в очереди до тех пор пока оно не сможет быть послано. 1111..11..22.. СС ппооммоощщььюю rrllpprr Вы также можете использовать _r_l_p_r для послания задания печати прямо в очередь удаленной машины без мороки с настройкой lpd для выполнения этой задачи. Это в большинстве случаев полезно в ситуациях когда вы печатаете на множество принтеров только время от времени. Из анонса _r_l_p_r: Rlpr использует TCP/IP для посылки заданий печати на сервера с lpd, находящиеся где угодно в сети. В отличии от lpr, он _н_е _т_р_е_б_у_е_т чтобы удаленный принтер был явно известен машине с которой вы хотите печатать, (например в _/_e_t_c_/_p_r_i_n_t_c_a_p) и таким образом является значительно белее гибким и требующим меньше администрирования. rlpr может использоваться везде где мог бы использоваться традиционный lpr, и он является совместимым с традиционным BSD lpr. Основная мощь rlpr заключается в удаленной печати _о_т_к_у_д_а _у_г_о_д_н_о _к_у_д_а _у_г_о_д_н_о без учета как система на которую вы хотите печатать была настроена. Rlpr может работать как фильтр, как и традиционный lpr, так что клиенты выполняемые на удаленной машине такие как netscape, xemacs, и т.п., могут печатать на вашу локальную машину с небольшими усилиями. Rlpr доступен с Metalab . 1111..22.. ННаа ппррииннттеерр WWiinn9955,, WWiinnNNTT,, LLaannMMaannaaggeerr,, ииллии SSaammbbaa Существует "Printing to Windows mini-HOWTO" в котором находится больше информации чем здесь. Возможно перенаправить очередь lpd через программу smbclient (часть набора Samba) на основанный на TCP/IP сервис печати SMB. Samba включает скрипт называемый smbprint. Вкратце, вы помещаете конфигурационный файл для нужного принтера в его директорию спула, и устанавливаете для него скрипт smbprint как _i_f-фильтр. Запись в _/_e_t_c_/_p_r_i_n_t_c_a_p выглядит примерно так: lp|remote-smbprinter:\ :lp=/dev/null:sh:\ :sd=/var/spool/lpd/lp:\ :if=/usr/local/sbin/smbprint: Вы должны прочитать документацию внутри скрипта smbprint для более детальной информации о настройке Вы также можете использовать программу smbclient для посылки файла прямо на сервис печати SMB без вовлечения в этот процесс lpd. Смотрите справочные страницы. 1111..33.. ННаа ппррииннттеерр NNeettWWaarree Набор программ ncpfs включает утилиту названную nprint, которая обеспечивает те же самые возможности как и smbprint, но для NetWare. Вы можете получить ncpfs с Metalab. Информация из записи в LSM для пакета версии 0.16: С помощью ncpfs вы можете монтировать тома вашего сервера netware под Linux. Вы также можете печатать в очереди печати netware и перенаправлять очереди печати netware на систему печати Linux. Вам необходимо ядро версии 1.2.x или 1.3.54 и выше. ncpfs НЕ работает с любыми ядрами 1.3.x ниже 1.3.54. Для того чтобы заставить nprint работать через lpd, вам нужно написать маленький скрипт для печати потока стандартного ввода на принтер NetWare, и установить его как _i_f-фильтр для очереди печати lpd. Вы получите что-то подобное этому: sub2|remote-NWprinter:\ :lp=/dev/null:sh:\ :sd=/var/spool/lpd/sub2:\ :if=/var/spool/lpd/nprint-script: nprint-script может выглядеть примерно так: #! /bin/sh # Вы должны сначала попробовать вход как guest без пароля! /usr/local/bin/nprint -S net -U name -P passwd -q printq-name - 1111..44.. ННаа ппррииннттеерр EEtthheerrTTaallkk ((AAppppllee)) Пакет netatalk включает что-то подобное nprint и smbclient. Другие имеют документированные процедуры для печати на и с сетей Apple много лучше чем я представлял; Смотрите Linux Netatalk-HOWTO . 1111..55.. ННаа HHPP ииллии ддррууггоойй eetthheerrnneett--ппррииннттеерр Принтеры HP и некоторые другие принтера идут с интерфейсом на который вы можете печатать прямо, используя lpd. Вы должны следовать инструкциям, которые идут с вашим принтером или его сетевым адаптером, но в главном такие принтера являются "работающим" lpd., и обеспечивают одну или более очередь на которые вы можете печатать. Например HP может работать с printcap подобным: lj-5|remote-hplj:\ :lp=/dev/null:sh:\ :sd=/var/spool/lpd/lj-5:\ :rm=printer.name.com:rp=raw: Принтера HP Laserjet с интерфейсами Jet Direct iв общем поддерживают две встроенных очереди lpd -- "raw", которая принимает PCL (и возможно Postscript) и "text", которая принимает чистый ascii (и автоматически справляется с лестничным эффектом). Если у вас JetDirect Plus3 трех-портовый принтер, то очереди называются "raw1", "text2", и так далее. Заметим, что компания ISS обнаружила набор атак denial of service (DoS), которые могут завесить интерфейсы HP Jetdirect. Большинство из них датируется началом осени 98. В средах большого масштаба, особенно в больших средах где некоторые принтера не поддерживают PostScript, может быть полезно создать выделенный сервер печати на который все машины будут печатать и на котором все задания ghostscript будут запущены. Это также позволяет вашей машине с Linux выступать как сервер печати для принтера, так что ваши пользователи сети смогут выполнять свои задания печати быстро и справляться с работой не ожидая пока принтер печатает какое-то другое задание посланное кем-то другим. Это также предполагается, если у вас есть старые HP Jetdirects, которые невозможно исправить; это уменьшает вероятность заклинивания принтеров. Чтобы сделать это, установить очередь на вашей машине, которая указывает на оборудованный ethernet принтер HP LJ (как показано выше). Затем укажите для всех клиентов вашей LAN, чтобы они печатали на очередь печати Linux (например lj-5 как в вышеприведенном примере). Некоторые сетевые принтера HP по всей видимости не нуждаются в установке страницы заголовка (banner page) посылаемой клиентом; вы можете отключить внутренне генерируемую страницу заголовка зайдя на принтер с помощью telnet, нажав два раза return, набрав "banner: 0" и затем "quit". Существуют другие настройки, которые вы можете изменить тем же способом; наберите "?" для просмотра списка установок. Полный набор установок принтера может контролироваться с помощью программного обеспечения фирмы HP WebJet . Этот пакет запускается как демон и принимает http запросы на назначенном порту. Он обслуживает формы и Java апплеты, которые могут контролировать принтера HP, работающие в сети. Теоретически, он также может контролировать очереди печати Unix, но он делает это используя сервис rexec, который полностью незащищенным. Я не советую вам использовать это свойство данного пакета. 1111..55..11.. ННаа ссттааррыыее ппррииннттеерраа HHPP Некоторые принтера (и печатающие сетевые "черные ящики") поддерживают только никуда не годные маленькие непротокольные соединения включая чистые TCP соединения. Примечательными в этой категории являются ранние модели карт JetDirect (включая некоторые карты JetDirectEx). В основном для печати на принтер вы должны открыть соединение TCP на принтер на указанный порт (обычно 9100 или 9100, 9101 и 9102 для трех-портовых принтеров) и запихнуть свое задание печати в принтер. LPRng (который вы должны использовать, если вы читаете это раздел) имеет встроенную поддержку для выдачи заданий печати на произвольные порты TCP, но при использовании BSD lpd это не так легко. Это может быть выполнено на Perl: #!/usr/bin/perl # Thanks to Dan McLaughlin for writing the original version of this # script (And to Jim W. Jones for sitting next to Dan when writing me # for help ;) $fileName = @ARGV[0]; open(IN,"$fileName") || die "Can't open file $fileName"; $dpi300 = "\x1B*t300R"; $dosCr = "\x1B&k3G"; $ends = "\x0A"; $port = 9100 unless $port; $them = "bach.sr.hp.com" unless $them; $AF_INET = 2; $SOCK_STREAM = 1; $SIG{'INT'} = 'dokill'; $sockaddr = 'S n a4 x8'; chop($hostname = `hostname`); ($name,$aliases,$proto) = getprotobyname('tcp'); ($name,$aliases,$port) = getservbyname($port,'tcp') unless $port =~ /^\d+$/;; ($name,$aliases,$type,$len,$thisaddr) = gethostbyname($hostname); ($name,$aliases,$type,$len,$thataddr) = gethostbyname($them); $this = pack($sockaddr, $AF_INET, 0, $thisaddr); $that = pack($sockaddr, $AF_INET, $port, $thataddr); if (socket(S, $AF_INET, $SOCK_STREAM, $proto)) { # print "socket ok\n"; } else { die $!; } # Give the socket an address. if (bind(S, $this)) { # print "bind ok\n"; } else { die $!; } # Call up the server. if (connect(S,$that)) { # print "connect ok\n"; } else { die $!; } # Set socket to be command buffered. select(S); $| = 1; select(STDOUT); # print S "@PJL ECHO Hi $hostname! $ends"; # print S "@PJL OPMSG DISPLAY=\"Job $whoami\" $ends"; # print S $dpi300; # Avoid deadlock by forking. if($child = fork) { print S $dosCr; print S $TimesNewR; while () { print S; } sleep 3; do dokill(); } else { while() { print; } } sub dokill { kill 9,$child if $child; } 1111..66.. ЗЗааппуусскк iiff ддлляя ууддааллеенннныыхх ппррииннттеерроовв Одна странность lpd в том что _i_f не запускается для удаленных принтеров. Если вам нужно выполнить _i_f, вы можете сделать это установив двойную очередь и перенаправляя задание. Как пример рассмотри такой _p_r_i_n_t_c_a_p: lj-5:remote-hplj:\ :lp=/dev/null:sh:\ :sd=/var/spool/lpd/lj-5:\ :if=/usr/lib/lpd/filter-lj-5: lj-5-remote:lp=/dev/null:sh:rm=printer.name.com:\ :rp=raw:sd=/var/spool/lpd/lj-5-raw: в свете этого скрипт filter-lj-5 будет выглядеть так: #!/bin/sh gs -q -dSAFER -sOutputFile=- - | \ lpr -Plj-5-remote -U$5 Опция _-_U lpr работает только если lpr запущен как демон, и она правильно устанавливает имя имя автора задания при его перенаправлении. Вы должны вероятно использовать более надежный метод получения имени пользователя, так как в некоторых случаях оно не является пятым аргументом. Смотрите справочную станицу _p_r_i_n_t_c_a_p. 1111..77.. ИИзз WWiinnddoowwss Печать из под клиента Windows (или OS/2) на сервер Linux прямо поддерживается через SMB используя пакет SAMBA, который также поддерживает разделение вашей файловой системы Linux с клиентами Windows. Samba включает в себя довольно полную документацию. Вы можете либо настроить magic-фильтр на машине с Linux и печатать на нее в формате PostScript или установить специфичные для принтера драйвера на всех машинах с Windows и обрабатывать очередь без фильтрации. Полагаясь на драйвера Windows вы можете в некоторых случаях получить более качественный вывод, но это дает больше административной нервотрепки если у вас много машин с Windows. Так что сначала попробуйте PostScript. 1111..88.. СС AAppppllee.. Netatalk поддерживает печать с клиентов Apple через EtherTalk. Смотрите Страницу Netatalk HOWTO для более детальной информации. 1111..99.. ИИзз ппоодд NNeettwwaarree Пакет ncpfs включает демона называемого pserver, который может быть использован для обеспечения сервиса очередей печати NetWare. Как я понял эта система требует основанную на Bindery систему NetWare, т.е. 2.x, 3.x, или 4.x с разрешенным доступом к bindery. Для более детальной информации о ncpfs и ее программе pserver смотрите FTP сервер ncpfs FTP . 1122.. ППррииннттеерраа ппррееддннааззннааччеенннныыее ттооллььккоо ддлляя WWiinnddoowwss Как я обсуждал ранее, некоторые принтера по определению не поддерживаются, потому-что они не умеют "говорить" на нормальном языке принтеров, вместо этого используя процессор компьютера для обработки картинки, которая передается на принтер с фиксированной скоростью. В некоторых случаях они также могут общаться на нормальных языках принтеров подобных PCL, но часто этого нет. В некоторых (действительно редких) случаях эти принтера даже не используют нормальное параллельное соединение, но полагается на поставляемый производителем драйвер для эмуляции поведения оборудования (наиболее важным является контроль потока). В любом случае есть несколько возможных решений если у вас такой принтер с неприятными свойствами. 1122..11.. РРее--ддииррееккттоорр GGhhoossttssccrriipptt ддлляя WWiinnddoowwss В настоящее время есть драйвер для Windows (называемый mswinpr2), который пропускает задание печати через Ghostscript до окончательной печати задания. (Довольно похоже на фильтр if в LPD системе Unix). Также существует драйвер Ghostscript, который будет печатать используя вызовы Windows GDI. Совместив все вместе, это должно позволить машине под Windows печатать PostScript на принтера работающие только под Windows, используя поставляемые производителем драйвера. Если вы заставили это работать, то затем вы должны следовать вышеприведенным инструкциям по настройке печати на Windows-принтер по сети из под Linux, чтобы позволить Unix (и другим машинам под Windows, Mac, и т.п.) печатать на ваш "неправильный" принтер. Как было сказано я никогда не пытался проделать это, поскольку у меня нет такого принтера, так что ваш путь по настройке может отличаться. Все программное обеспечение указанное в инструкции должно быть доступно с домашней страницы Ghostscript (смотрите ссылку в разделе Ghostscript этого документа). 1122..22.. ППррооггррааммммаа ppbbmm22ppppaa Некоторые принтера HP используют "Printing Performance Architecture" (маркетиноговое название для "мы были слишком дешевыми чтобы реализовывать PCL). Это поддерживается обходным путем через транслятор pbm2ppa, написанный Tim Norman. Обычно вы используете ghostscript для растеризации PostScript в точечную картинку в формате pbm и затем используете pbm2ppa для ее трансляции в картинку в специфическом для принтера формате ppa, которую можно отправлять на принтер. Эта программа также поставляется сейчас в формате драйвера ghostscript. Программное обеспечение для ppa может быть найдено на домашней странице ppa ; pbm2ppa поддерживает некоторые модели HP 720, 820, и 1000; читайте документацию, которая поставляется вместе с пакетом для более детальной информации о поддержке принтеров с ppa. 1122..33.. ППррооггррааммммаа ppbbmm22ll77kk Большинство дешевых струйных принтеров Lexmark используют собственный язык и следовательно являются принтерами только для Windows. Однако, Henryk Paluch написал программу, которая может печатать в черно-белом режиме на Lexmark 7000. Имеется надежда, что он сможет выяснить как печатать в цвете и расширит поддержку для остальных струйных принтеров Lexmark. Для дополнительной информации смотрите эту страницу . 1133.. ККаакк ппееччааттааттьь ннаа ффаакксс--ммаашшииннуу 1133..11.. ИИссппооллььззууяя ффаакксс--ммооддеемм Существует некоторое количество программ для факса, которые позволят вам пересылать документы по факсу. Одна из наиболее мощных программ это _H_y_l_a_F_a_x, автор Sam Leffler, доступная с ftp.sgi.com. Она поддерживает все виды вещей от множественных модемов до широковещательной передачи. SuSE продает клиента Java HylaFax, который как утверждают работает на любых платформах с Java (включая Windows и Linux). Существует также факс-клиент не на Java для большинства платформ; Linux может обрабатывать едва ли не все потребности для работы с факсом. Также доступна и является лучшим выбором для большинства машин с Linux efax, простая программа которая посылает факсы. Программа для getty -- mgetty может передавать факсы (и даже создавать голосовые письма на некоторых модемах!). 1133..22.. ИИссппооллььззууяя ууддааллеенннныыйй ссееррввиисс ппееччааттии Существует экспериментальный сервис, который позволит вам послать сообщение по электронной почте в котором находится что-то что вы хотите напечатать, так что содержимое этого письма появится на факс-машине в другом месте. Поддерживаются форматы подобные postscript, так что даже если глобальный охват является неоднородным, то, это все равно может быть очень полезным сервисом. Для более детальной информации о печати через сервис удаленной печати, смотрите Remote Printing WWW Site . 1144.. ККаакк ггееннееррииррооввааттьь ччттоо--ттоо ссттоояящщееее ппееччааттии Здесь мы перейдем к реальному программному обеспечению. По существу Linux может запускать много типов исполнимых файлов с разной степенью удачи: Linux/x86, Linux/Alpha, Linux/Sparc, Linux/foo, iBCS, Win16/Win32s (при помощи dosemu и, иногда, с Wine), Mac/68k (через Executor), я Java. Я буду просто обсуждать родное для Linux и общее для Unix программное обеспечение. Для самого Linux, выбор довольно ограничен теми продуктами доступными в общем для Unix: 1144..11.. ЯЯззыыккии ррааззммееттккии Большинство языков разметки лучше подходят для больших или повторяющихся проектов, где вы хотите чтобы компьютер контролировал компоновку текста, чтобы сделать ее единой. nroff Этот один из первых языков разметки Unix. Справочные страницы -- это наиболее общий пример вещей отформатированных с использованием макросов *roff; много людей "ругаются" на нем, но nroff имеет, по крайней мере для меня, более тайный синтаксис чем необходимо, и вероятно делает бедный выбор для новых работ. Это стоящее знание, хотя вы можете печатать справочные страницы прямо в postscript с помощью groff. Большинство команд man будут делать это для вас с помощью man -t foo | lpr. TTeeXX TeX, и макро-пакет LaTeX, это один из наиболее широко применяемых языков разметки в Unix. Технические работы часто написаны в LaTeX, потому-что он сильно упрощает создание компановки и это _в_с_е _е_щ_е одна из нескольких систем обработки текста, которая поддерживает математику и хорошо и полностью. Выходной формат TeX это dvi, и он конвертируется в PostScript или Hewlett Packard PCL при помощи dvips или dvilj. Если вы желаете установить TeX или LaTeX, установите всю группу пакетов teTeX; они содержат все необходимое. SSGGMMLL Существует по крайней мере один свободный обработчик (parser) sgml доступный для Unix и Linux; его форма это основа системы документации Linuxdoc-SGML. Он может также поддерживать другие DTD. HHTTMMLL Некоторые люди предполагают, что для отдельных проектов может быть достаточно писать их в HTML и печатать используя Netscape. Я не согласен с этим, но это YMMV. 1144..22.. ТТееккссттооввыыее ппррооццеессссооррыы сс WWYYSSIIWWYYGG В настоящее время больше нет недостатка в WYSIWYG программном обеспечении для обработки текстов. Доступно несколько полных офисных наборов, включая один, который свободен для персонального использования (StarOffice). SSttaarrOOffffiiccee Немецкая компания распространяет по сети StarOffice свободным для Linux. Полный офисный набор имеет все возможности которые вы ожидаете и вы можете не беспокоится об оплате. Существует mini- HOWTO, где описывается как получить и установить этот пакет. Он генерирует на выходе PostScript или PCL, так что он должен работать с большинством принтеров в Linux. WWoorrddPPeerrffeecctt Компания Corel свободно распространяет базовую версию Word Perfect 8 для Linux, и предполагается, что компания также будет распространять Corel Draw и Quattro Pro, когда они будут перенесены под linux. Вероятно это наилучший выбор, если у вас ARM машина; Corel делает основанные на ARM компьютеры Netwinder Linux и и почти всегда предлагает ARM Linux версии всех своих продуктов. Вы можете также купить полную версию программ и поддержку этих программ, вместе или по отдельности. Страница Шрифты и принтера для Linux WordPerfect имеет информацию о настройке WordPerfect для использования либо Ghostscript либо его встроенных драйверов принтеров (которые очевидно похожи на драйвера принтеров DOS WordPerfect, в том случае если драйвер вашего принтера не включен в дистрибутив WP8). AApppplliixx Applix это многоплатформенный оффисный набор (например, разные типы юниксов, Windows и другие платформы), продаваемый фирмой Applix. Red Hat и SuSE продавали их, когда это было лишь "игрой в города"; сейчас продажу опять осуществляет Applix. LLyyXX LyX это надстройка для LaTeX, которая выглядит очень многообещающей. Смотрите Домашнюю страницу LyX для более детальной информации. Также существует версия LyX сделанная в стиле KDE, она называется Klyx; автор LyX и зачинщик проекта KDE -- это одна и та же персона. MMaaxxwweellll Maxwell это простой текстовый процессор, базирующийся на формате MS RTF, который был начат как коммерческий продукт, но сейчас распространяется под действием лицензии GPL. TThhee AAnnddrreeww UUsseerr IInntteerrffaaccee SSyysstteemm ((ССииссттееммаа ппооллььззооввааттееллььссккооггоо интерфейса Andrew)" AUIS включает ez, редактор WYSIWYG-стиля с основными возможностями систем обработки текста, возможностями для работы с HTML и полную поддержку MIME электронной почты и групп новостей. К сожалению AUIS больше не сопровождается. KKooffffiiccee Проект KDE работает в направлении полного набора офисных программ. Я думаю, что он не будет готов в ближайшее время. Текстовый процессор несомненно будет потомком программы LyX. GGNNOOMMEE Проект GNOME также работает в направлении создания офисных программ лицензированных по лицензии GNU. Хотя еще ничего не доступно. Jeff Phillips использует Caldera WordPerfect 7 для Linux (на Slackware) и говорит что он работает хорошо. Он по всей видимости включает встроенную поддержку принтера, как некоторые могут ожидать. Caldera должна иметь информацию на . Вы также можете купить более новую версию Wordperfect прямо с Corel, выбрав порт под Unix. Другие продавцы могут свободно посылать мне информацию о своих предложениях. 1155.. ЭЭккрраанннныыйй ппррооссммооттрр ффааййллоовв ддлляя ппееччааттии Почти все что вы можете напечатать вы также можете просмотреть на экране. 1155..11.. PPoossttSSccrriipptt Ghostscript имеет драйвер для X11, который лучше всего используется под управлением просмотрщика PostScript, называемого Ghostview. Последние версии этих программ также должны уметь просматривать файлы PDF. Заметим, что gv заменил более старый просмотрщик "Ghostview"; новый интерфейс пользователя более приятный и функциональный чем линейный интерфейс ghostview на основе старого Athena gui. 1155..22.. TTeeXX ddvvii Независящие от устройства (DeVice Independant) файлы TeX могут быть просмотрены под X11 с помощью xdvi. Современные версии xdvi вызывают ghostscript для обработки специальных вставок PostScript. Также существует драйвер VT100. Он называется dgvt. Tmview работает с Linux и svgalib, если надо вы можете работать с ним. 1155..33.. AAddoobbee PPDDFF Adobe Acrobat Reader доступен для Linux; просто загрузите его с сервера фирмы . Вы также можете использовать xpdf, который является freeware и идет с исходными текстами, и я думаю сейчас Ghostview поддерживает просмотр файлов PDF при помощи gs под X11. 1166.. ППооссллееддооввааттееллььнныыее ппррииннттеерраа ппоодд ууппррааввллееннииеемм llppdd 1166..11.. ННаассттррооййккаа pprriinnttccaapp Lpd обеспечивает пять атрибутов, которые вы можете установить в _/_e_t_c_/_p_r_i_n_t_c_a_p для контроля всех установок принтера на последовательном порту. Читайте справочную страницу _p_r_i_n_t_c_a_p и отметьте значение атрибутов _b_r_#, _f_c_#, _x_c_#, _f_s_# and _x_s_#. Последние четыре из этих атрибутов являются битовыми картами показывающими установки для использования портом. Атрибут _b_r_# это просто скорость передачи в бодах, например `br#9600'. Очень легко переводить из установок stty в установки флагов printcap. Если вам необходимо, то смотрите справочную страницу stty. Используйте stty для настройки порта принтера, так что вы сможете выполнить копирование файла на него и получить правильно напечатанный файл. Здесь приводятся данные того, что `_s_t_t_y _-_a' показывает для моего принтерного порта. dina:/usr/users/andy/work/lpd/lpd# stty -a < /dev/ttyS2 speed 9600 baud; rows 0; columns 0; line = 0; intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = ; eol2 = ; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; min = 1; time = 0; -parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl ixon -ixoff -iuclc -ixany -imaxbel -opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 -isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl -echoke Разница между этим и тем способом которым порт инициализируется при загрузке во флагах -clocal, -crtscts, and ixon. Настройки вашего порта могут отличаться в зависимости от того как ваш принтер делает контроль потока. В действительности вы используете stty странным способом. Так stty работает с терминалами, подключенными к его стандартному вводу, вы используете его для манипуляций с заданным последовательным портом используя символ `<' как показано выше. После того как вы правильно установили настройки stty, так что `_c_a_t _f_i_l_e _> _/_d_e_v_/_t_t_y_S_2' (в моем случае) посылает файл на принтер, посмотрите в файл /usr/src/linux/include/asm-i386/termbits.h. Этот файл содержит некоторое количество #defines и несколько структур (вы можете захотеть напечатать этот файл на принтере (он у вас работает, не так ли?) и использовать его как черновик). Перейдите в раздел который начинается с: /* c_cflag bit meaning */ #define CBAUD 0000017 Этот раздел перечисляет значение битов _f_c_# и _f_s_#. Вы будете уведомлены, что имена здесь (после скорости передачи) соответствуют одной из строк вывода stty. Не я ли сказал что все будет легко? Заметим какая из этих настроек начинается с a -- в вашем выводе stty. Просуммируем все эти числа (они в восьмеричном представлении). Это представляет собой биты которые вы хотите очистить, так что результатом будет ваше свойство _f_c_#. Конечно помните что вы будете устанавливать биты прямо после очистки, так что вы можете просто использовать `fc#0177777' (я так делаю). Теперь сделаем это для тех установок (перечисленных в этом разделе) которые не имеют a в начале -- в вашем выводе stty. В моем примере самые важные это CS8 (0000060), HUPCL (0002000), и CREAD (0000200). также заметим флаги для вашей скорости передачи (мои равны 0000015). Сложим их все, и в моем примере получим 0002275. Это идет как ваше свойство _f_s_# (`fs#02275' великолепно работает в моем примере). Сделайте тоже самое с установкой и очисткой для следующего раздела включаемого файла, "c_lflag bits". В моем случае я не устанавливал ничего, так что я просто использовал `xc#0157777' и `xs#0'. 1166..22.. ССттааррыыее ппооссллееддооввааттееллььнныыее ппррииннттеерраа ии ппооттеерряя ссииммввооллоовв Jon Luckey указал, что некоторые старые последовательные принтера с десятицентовым последовательным интерфейсом и маленькими буферами _д_е_й_с_т_в_и_т_е_л_ь_н_о останавливаются когда используется контроль потока. Он нашел, что запрещение FIFO для последовательного порта 16550 его Linux-машины с помощью setserial исправило проблему потерянных символов (вы по всей видимости можете просто указать тип uart как 8250 чтобы сделать это). 1177.. CCrreeddiittss Информация о smbprint из статьи Marcel Roelofs . Информация о nprint для использования принтеров Netware была дана Michael Smith . Раздел о последовательных принтерах под lpd от Andrew Tefft . Данные о гаммах и прочих вещах для gs были посланы Andreas . Два параграфа о о 30-ти секундной задержке (closing_wait) последовательного драйвера были присланы Cris Johnson . Robert Hart послал несколько великолепных параграфов об установке сервера печати на сетевых принтерах HP, которые я использовал без изменений. И специальное спасибо десяткам тех, кто в течении года указывал на типографские опечатки, неправильные ссылки и ошибке в документе.