如何获得理由CUPS工作已停止?

如何通过CUPS API获取CUPS打印作业失败的原因?

使用CUPS API,我打印了两份未能打印的作业。 在CUPS网页界面上,我可以看到他们失败的原因:“不支持的打印数据”。 和“无法写入打印数据”。

CUPS打印作业错误说明

但是,API似乎并未包含这些原因。 cupsGetJobs()方法返回cups_job_s结构体,如下所示:

struct cups_job_s {
    time_t completed_time;
    time_t creation_time;
    char *dest;
    char *format;
    int id;
    int priority;
    time_t processing_time;
    int size;
    ipp_jstate_t state;
    char *title;
    char *user;
};

我检查了所有这些字段,其中没有一个包含屏幕截图中显示的错误字符串。


我相信这归结为job-state-message属性。 为了检索作业属性,我相信你将不得不使用IPP API,例如(未经测试):

ipp_t *request = ippNewRequest(IPP_GET_JOBS);
...
ipp_t *response = cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/");
...
ipp_attribute_t *attr = ippFindAttribute(response, "job-state-message", IPP_TAG_TEXT);

重要的是要注意,与job-state相关的属性可能会在工作已经被接受后的某个时候更新。 由于服务器不知道打印是否真的会成功(因为墨菲定律有很多因素),这项工作被接受,并在失败时相应地更新job-state和相关属性。 job-state-message不是强制性的。

如果您希望应用程序对这些事件产生反应,而不是以固定的时间间隔查询CUPS服务器,则可以订阅一些D-Bus事件 (请参阅Apple的实现)。 如果你想要一个消费者实现的例子,你可以阅读gnome-control-center的打印机面板代码。

下面我试图引用RFC 2911(IPP 1.1)的一些相关部分:

3.1.9作业创建操作

...

在作业处理时,由于Printer对象已经在创建请求的响应中响应了成功的状态码,所以如果Printer对象检测到错误,则Printer对象无法通知操作状态错误的最终用户码。 在这种情况下,根据错误,打印机可以将作业对象的“作业状态”,“作业状态原因”或“作业状态消息”属性设置为适当的值,以便稍后查询可以报告正确的作业状态。

注意事件的异步通知超出了本IPP / 1.1文档的范围。

4.3.7 job-state(type1枚举)

...

6''处理停止':由于许多原因,作业在处理过程中停止,并且只要原因不再存在,将立即返回'处理'状态。

作业的“作业状态原因”属性可以指示作业停止处理的原因。 例如,如果输出设备停止,“打印机停止”值可以包含在作业的“作业状态原因”属性中。

注意:当输出设备停止时,设备通常在设备本地以人类可读形式指示其状态。 通过查询打印机对象的“打印机状态”,“打印机状态原因”和“打印机状态消息”属性,客户端可以远程获取更完整的设备状态。

4.3.9 job-state-message(文本(MAX))

该属性用可读文本指定关于“工作状态”和“工作状态原因”属性的信息。 如果Printer对象支持这个属性,那么Printer对象必须能够以Printer的“generated-natural-language-supported”属性标识的任何自然语言生成此消息(请参阅“attributes-natural-language”操作属性在3.1.4.1节中规定)。

该值不应包含未包含在“作业状态”和“作业状态原因”属性值中的附加信息,例如解释器错误信息。 否则,应用程序可能会尝试解析(本地化文本)。 对于诸如应用程序消耗的解释器错误或特定文档访问错误等附加信息,需要开发和注册具有关键字值的新属性。

脚注 :我没有亲自做过,但RFC确实告诉你你应该期待什么。


Debian 8.6 Cinnamon 2.2.16(linux)从开始菜单执行此操作:

  • 点击管理| 打印设置,
  • 然后选择您停顿的CUPS打印机,
  • 点击解锁(并给它你的管理员密码),
  • 单击服务器| 设置,
  • 在这里点击蓝色的“问题?” 链接。
  • 这将打开打印疑难解答。 它会告诉你下一步该做什么。

    可能您只需在打印设置中检查CUPS打印机的Enabled属性。 (您需要先解锁)。

    最后,为避免这种情况再次发生,请在上述打印机设置(在属性|策略下)将打印机“策略”更改为“重试作业”。

    为我修好了!

    导致此问题的原因:如果我的无线打印机在打印到CUPS打印机时断电,并且我的策略是“停止打印机”,则会收到一条消息,指出我无法打印并且打印机已禁用(启用未选中) 。 只有当策略设置为“重试作业”时,Enabled才会被取消选中。 打印机重新启动几分钟后,您的作业将开始打印。

    (我关于这个的其他帖子。)

    链接地址: http://www.djcxy.com/p/80941.html

    上一篇: How to get reason CUPS job was stopped?

    下一篇: can I make it work?