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

时间:2014-08-22 22:21:16

标签: message jobs cups

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

使用CUPS API,我打印了两个无法打印的作业。在CUPS Web界面上,我可以看到它们失败的原因:"不支持的打印数据。"和"无法写入打印数据。"

CUPS print job error description

但是,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;
};

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

2 个答案:

答案 0 :(得分:4)

我相信这归结为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相关的属性可能会在作业被接受后的某个时刻更新。由于服务器不知道打印是否真的成功(因为 Murphy定律许多因素),作业被接受,失败时它会相应地更新job-state和相关属性。 job-state-message不是强制性的。

如果您希望应用程序对这些事件做出反应而不是以固定间隔查询CUPS服务器,则可以订阅一些 D-Bus事件see Apple's implementation) 。如果您想要一个消费者实施示例,您可以阅读Printer's Panel code from gnome-control-center

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

3.1.9创建作业

  

...

     

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

     

注意:事件的异步通知超出了范围     这份IPP / 1.1文件。

4.3.7作业状态(type1枚举)

  

...

     

6''处理已停止':处理时作业已停止      由于种种原因而将返回      一旦原因不再存在,就处理'处理'状态      本。

     

作业的“作业状态 - 原因”属性可以指出原因      这份工作已停止处理。例如,如果      输出设备停止,'打印机停止'值可以      被列入工作的“工作状态 - 原因”属性。

     

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

4.3.9作业状态消息(文本(MAX))

  

此属性指定有关“工作状态”和“工作 - 的信息     状态原因“人类可读文本中的属性。如果是打印机     object支持这个属性,Printer对象必须能够     用任何自然语言生成此消息     打印机的“生成自然语言支持”属性(请参阅     中指定的“attributes-natural-language”操作属性     第3.1.4.1节。

     

值不应包含未包含的其他信息     “工作状态”和“工作状态 - 原因”属性的值,     如解释器错误信息。否则,申请     程序可能会尝试解析(本地化文本)。对于这样     其他信息,如应用程序的解释器错误     程序消费或特定文档访问错误,新的     需要开发和注册具有关键字值的属性。

脚注:我没有亲自完成,但RFC确实告诉了您应该期待的内容。

答案 1 :(得分:0)

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

  • 单击“管理”|打印设置,
  • 然后选择停用的CUPS打印机,
  • 点击解锁(并提供管理员密码),
  • 单击“服务器”|设置,
  • 点击蓝色“问题?”链接。

这将打开打印疑难解答程序。它会告诉你下一步该做什么。

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

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

为我修好了!

导致此问题的原因:如果我打印到CUPS PRINTER时我的wifi打印机电源关闭,而我的政策是“停止打印机”,那么我收到一条消息,说明我无法打印并禁用打印机(未选中“已启用”)。仅当策略设置为“重试作业”时才会取消选中“已启用”。打印机重新启动几分钟后,您的作业将开始打印。

(我other关于此事的帖子。)