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);
});
Кто-нибудь знает, почему у меня возникла эта проблема или.. как заставить ее работать? Спасибо!
1 ответ
CUPS может пересылать только состояния заданий, полученные от принтера. Многие драйверы принтеров и протоколы работают как "запустить и забыть".
Обычно принтеры IPP позволяют CUPS и другим клиентам отслеживать текущее состояние задания до его завершения / печати. Некоторые производители не реализуют IPP должным образом и классифицируют отправленные задания как напечатанные - даже если в принтере застряла бумага!
Заключение:
Если ваш принтер не поддерживает IPP, как указано, вы, вероятно, не сможете проверить, "напечатано ли успешно".
@ Якуб, возможно, вы общаетесь с 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 принтера. Кубкиsocket
внутренняя обработка этой буферизации для принтера не получит никаких других подтверждений от принтера, кроме того, что обеспечивает TCP/IP, подтверждающий, что последний пакет был передан. Следовательно, он должен закрыть свой процесс и сообщить о нем демону CUPS.successful-ok
, даже если принтер все еще занят выплевыванием большого количества бумаги и, возможно, никогда не выполнит всю работу, потому что он застрял в бумаге...Если ты видишь
lpd://
ситуация аналогичная (но использует порт 515).
Вы можете добиться успеха с полной отчетностью о состоянии, переключив путь CUPS-to-printdevice с AppSocket или LPD на IPP следующим образом:
sudo lpadmin -p printername ipp://ipaddress-of-printer
или же
sudo lpadmin -p printername http://ipaddress-of-printer:631