我们有一台运行 CUPS 的 Redhat 机器 (2.6.9-42.ELsmp)。有时,人们会向打印机发送大文件,然后打印机卡住了,因此他们重新启动打印机。打印机 300 秒后没有响应,打印机将变为不可用。然后 CUPS 会将打印机从可用打印机列表中删除,并且不会再尝试。
我是否可以进行任何设置,以便每当打印机再次上线时,CUPS 都会尝试与打印机通信并将其重新添加到列表中?
我们“解决”这个问题的方法是,每次发生这种情况时,我们都会手动修改 Printers.conf 文件,将打印机状态更改为“空闲”,然后重新启动服务。我相信有更好的办法,不是吗?
谢谢,
谭。
答案1
应该通过更改 cupsd.conf 或 Printers.conf 中的 ErrorPolicy 来解决此问题:
CUPS 1.3/Mac OS X 10.5错误政策
例子
ErrorPolicy 中止作业
ErrorPolicy 重试作业
错误策略停止打印机
描述
ErrorPolicy 指令定义了当后端无法向打印机发送打印作业时使用的默认策略。[...]
看:http://www.cups.org/doc-1.4/ref-cupsd-conf.html#ErrorPolicy
默认值为:
stop-printer - 停止打印机并保留作业以供将来打印
但是你可能想要:
retry-job - 等待 N 秒后重试作业 [...]
(或者可能重试这项工作)。
注意:在 CUPS V1.4+ 上,它被称为 FatalErrors。
答案2
根据您所运行的 CUPS 版本,您可以用不同的方法来解决您的问题。
另外,这取决于 CUPS 服务器打印队列如何具体连接到实际打印设备:ipp://?、socket://?、lpd://?
更多的CUPS 的最新版本带有一个可以提供帮助的内置功能。它被称为“ErrorPolicy”。它的默认设置在 cupsd.conf 中选择,并确定 cupsd 应如何处理未按预期运行的打印队列。您有 4 个选项可以设置为默认值或单独标记到每个队列:
ErrorPolicy abort-job
ErrorPolicy retry-job
ErrorPolicy retry-this-job
ErrorPolicy stop-printer
- 中止工作
- -- 中止此作业并继续执行同一队列中的下一个作业
- 重试作业
- -- 等待 N 秒后重试此作业(其中 N 由以下因素决定:cupsd.conf的“JobRetryInterval”指令)。
- 重试这个工作
- ——立即无限期地重试当前作业。
- 停止打印机
- -- 停止当前打印队列并保留作业以供将来打印。这仍然是默认设置,除非您按照上述替代方案另行定义。它也是 CUPS 以前版本中所有队列的默认 + 唯一可能的行为(根据您的问题,您确实想摆脱该队列)。
此外,您可以为每个单独的打印队列设置单独的 ErrorPolicies。此设置将在 Printers.conf 文件中注明。(使用 命令行进行设置lpadmin -p printername -o printer-error-policy=retry-this-job
)。
为了旧版本的 CUPS我建议你看一下beh
CUPS后端处理程序.beh
是一个可应用于任何 CUPS 后端的包装器。
假设您的打印队列当前已定义后端socket://192.168.1.111:9100
,并且其行为方式您不喜欢(由于网络连接问题,cupsd 有时会禁用它)。beh
您可以像这样重新定义后端:
beh:/0/20/120/socket://192.168.1.111:9100
这将以两分钟为间隔重试 20 次作业,并且仅在仍未成功时禁用队列。或者您可以这样做:
beh:/1/3/5/socket://192.168.1.111:9100
这将重试该作业 3 次,每次尝试之间间隔 5 秒。如果该作业仍然失败,则将其丢弃,但不会禁用队列。您想让 cupsd 无限期地尝试连接到设备吗?好的,试试这个:
beh:/1/0/30/socket://192.168.1.111:9100
不断尝试,直到打印机恢复。连接尝试间隔为 30 秒。打印机关闭时作业不会丢失。只需关闭打印机即可有意延迟打印。对于台式打印机和/或家庭用户来说,这是一种很好的配置。
总的来说,没有必要摆弄 bash 脚本、cron 作业,lpadmin
或cupsenable
为了sudo
重新激活不稳定的 CUPS 队列。
答案3
您可以简单地以 root(或其他 cups 管理员帐户)身份使用“enable”命令。如果这种情况发生得太频繁,请添加一个小型 crontab,使用“lpstat -a”找出已禁用的打印机。