CUPS возвращает «завершено» для заданий, которые все еще печатаются

Я общаюсь с CUPS по протоколу IPP. У меня все драйверы для моих принтеров установлены в CUPS (с использованием файла .ppd), а на принтеры установлена ​​последняя прошивка.

Когда я запрашиваю задание, которое принтер печатает прямо сейчас, он говорит, что состояние задания «завершено» еще до того, как принтер закончит печать. Кажется, что CUPS помечает задание как «завершенное», когда заканчивает «загрузку» файла.

Я бы не ожидал такого поведения, и мне в основном нужно знать, когда именно принтер напечатал последнюю бумагу для задания. Код выглядит следующим образом. self.printer().ippPrinter() является экземпляром node-ipp и указывает на принтер. Чтобы прочитать состояние задания, я использую атрибут 'job-state'.

var msg = {
  "operation-attributes-tag": {
    'job-id': id
  }
};

self.printer().ippPrinter().execute("Get-Job-Attributes", msg, function(err, res){
  var attributes = res['job-attributes-tag'];

  self.setAttributes = attributes;
  callback.call(self, attributes);
});

Кто-нибудь знает, почему у меня возникла эта проблема или ... как заставить ее работать? Спасибо!


person Jakub    schedule 30.06.2014    source источник


Ответы (2)


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

Обычно IPP-принтеры позволяют CUPS и другим клиентам отслеживать текущее состояние задания до тех пор, пока оно не будет завершено/распечатано. Некоторые производители неправильно реализуют IPP и классифицируют отправленные задания как напечатанные, даже если в принтере произошло замятие бумаги!

Заключение:

Если ваш принтер не поддерживает IPP, как указано, вы, вероятно, не сможете проверить «успешно напечатано».

person IPP Nerd    schedule 11.05.2015
comment
Петр, я заканчиваю выполненные задания, когда принтер не напечатал ни одной страницы (но он получил все входные данные и позже я могу попросить принтер продолжить задание вручную). Я предполагаю, что бэкэнд, который говорит о протоколе принтера (например, AppSocket для HP) может выполнять только «выстрелил и забыл», о котором вы упоминаете, а CUPS может только пометить эту работу как завершенную. Для протоколов lpd и socket есть шанс, что изменением драйвера эту ситуацию можно было бы улучшить? Другой драйвер может установить лучший бэкэнд? Спасибо. - person gabrielgiussi; 19.07.2017
comment
Я не знаю, предлагают ли протоколы lpd или socket лучшие способы мониторинга заданий. В любом случае принтер также должен поддерживать этот мониторинг. По моему опыту, ipp предлагает больше вариантов, но это может быть предвзятое мнение :-) - person IPP Nerd; 01.12.2017

@Jakub, вы вполне можете общаться с CUPS по протоколу IPP... Но уверены ли вы, что CUPS обменивается данными с устройством печати через IPP?

Вы можете проверить это, запустив

 lpstat -h cupsservername -v

Это должно вернуть URI устройства, назначенный каждой очереди печати, который CUPS использует для адресации фактического устройства печати:

  • Если этот URI действительно содержит ipp://, ipps://, http:// или https://, CUPS действительно сообщает IPP устройству печати, и вы сможете получать действительно правильные сообщения о состоянии.

  • Но если вы видите socket://, значит, CUPS настроен на использование метода AppSocket (иногда также называемого «HP Jet Direct» или «IP Direct Printing») для пересылки заданий. Это протокол «выстрелил и забыл». По сути, это то же самое, как если бы вы запустили netcat print-device 9100 < myprintfile, чтобы переместить данные для печати на порт 9100 принтера. Серверная часть CUPS socket, обрабатывающая эту буферизацию на принтер, не получит от принтера никакого другого подтверждения, кроме того, что предоставляет TCP/IP, подтверждая, что последний пакет был передан. Следовательно, он должен закрыть свой процесс и сообщить демону CUPS successful-ok, даже если принтер все еще занят выплевыванием большого количества бумаги и, возможно, никогда не завершит задание полностью, потому что он столкнулся с замятием бумаги...

  • Если вы видите lpd://, ситуация аналогична (но используется порт 515).

Вы можете добиться успеха с полным отчетом о состоянии, переключив путь CUPS-to-printdevice с AppSocket или LPD на IPP следующим образом:

 sudo lpadmin -p printername ipp://ipaddress-of-printer

or

 sudo lpadmin -p printername http://ipaddress-of-printer:631
person Kurt Pfeifle    schedule 09.12.2018
comment
Что делать, если URI содержит usb://? - person Joe Van Dyk; 02.01.2019
comment
@JoeVanDyk: ... тогда наверняка CUPS НЕ взаимодействует с устройством печати через IPP. - person Kurt Pfeifle; 03.01.2019