如何从命令行恢复CUPS打印机?


42

我的CUPS中有打印机,由于驱动程序问题(HP 1010),有时会暂停。

我想编写一个外壳脚本,该脚本每小时执行一次,以恢复CUPS中的打印机。但是我不知道在几分钟后如何从shell命令行恢复打印机。


造成这种情况的原因:例如,当我的wifi打印机电源关闭时,似乎清除了Enabled标志。即使在打印机重新通电后,“启用”标志也不会还原为选中状态。.. ---作业将堆积在打印队列中。错误消息是“筛选器失败”。当我在打印机设置中选中此框时,打印机将再次开始打印。
椭圆视图

Answers:


66

有cupsenable命令。

cupsenable printer

启动禁用的打印机(要查找打印机名称,可以使用lpstat -p或列出打印机lpc status)。

您可能必须以root用户或通过sudo运行命令。因此,如果必须在Shell脚本中启用打印机,则必须将Shell添加到root的crontab中,或编辑sudoers文件。


1
与“使用过度膨胀的杯子配置”(如superuser.com/a/280400/160771)相比,此答案+1 确实有所帮助。还有一点很重要,因为OP想要了解命令行
humanityANDpeace

25

根据您所运行的CUPS的版本,可以用不同的方式解决您的问题。

  1. 更多最新CUPS的版本(1.2及以上版本)配有一个内置功能,可以帮助这里。它称为“ ErrorPolicy”。在cupsd.conf中选择了默认设置,并确定cupsd应如何处理行为不符合预期的打印队列。您有3种选择分别标记每个队列:

    ErrorPolicy abort-job  
    ErrorPolicy retry-job  
    ErrorPolicy retry-this-job  
    ErrorPolicy stop-printer  
    

    说明:

    • abort-job
      -中止该作业并继续执行同一队列中的下一个作业

    • retry-job
      -等待N秒后重试此作业(其中N由cupsd.conf的“ JobRetryInterval”指令确定)。

    • retry-this-job
      -立即无限期地重试当前作业。

    • stop-printer
      -停止当前的打印队列并保留作业以备将来打印。这仍然是默认值,除非您按照上述替代方法另外定义。这也是默认值+仅适用于早期版本CUPS中所有队列的可能行为(您希望根据自己的问题摆脱此行为)。

    此外,您可以为每个单独的打印队列设置单独的ErrorPolicies。该设置将在printers.conf文件中注明。(从命令行使用进行设置lpadmin -p printername -o printer-error-policy=retry-this-job)。

  2. 对于较旧版本的CUPS,建议您看看behCUPS 后端处理程序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作业,lpadmincupsenable或者sudo为了重新激活CUPS队列下去不正常。


如何为最新版本的CUPS设置重试间隔?
Sepero'2

@Sepero:是的。例如:您可以JobRetryInterval 58尝试每58秒尝试一次。其他可能的值是1w(1周),3d(3天),7h(7小时)或4m(4分钟)。
Kurt Pfeifle,2015年

@Sepero:此处记录了CUPS v1.7之前的所有可能cupsd.conf参数:http : //www.cups.org/documentation.php/doc-1.7/ref-cupsd-conf.html 。检查页面右侧每个参数的注释:它将告诉您哪个CUPS版本是第一个支持它的版本。快乐发现更多有用的参数!:-)
Kurt Pfeifle 2015年

8

-E与一起使用的打印机选项lpadmin应该可以做到这一点。您可能只需要使用lpadmin命令创建一个cron作业。

lpadmin [-U username ] [ -h server[:port] ] -p printer option(s)

每小时cron输入:

0 * * * * /usr/sbin/lpadmin -p your_printer -E

您可以通过运行以下命令添加它:

sudo crontab -e

确保-E在打印机名称后添加,因为此处是打印机选项,而不是lpadmin选项。请注意以下man lpadmin注释中指出的页面摘录:

在-d,-p或-x选项之前指定时,-E选项在连接到服务器时强制加密。


2
错了 在这种情况下,-E是打印机选项,并且必须在打印机名称之后使用,否则,您只是在打开通信加密。developer.apple.com/library/mac/documentation/Darwin/Reference/…- 在-d,-p或-x选项之前指定时,-E选项在连接到服务器时强制加密。
scragar

这是唯一适用于我的解决方案。杯子经常无缘无故地暂停打印机。该error-policy不能解决任何事情。cupsenable没有解决任何问题。只lpadmin对我有用。
λuser

6

我的打印机是HP CP1215,也有一个错误:打印机已暂停-“ / usr / lib / cups / backend / hp失败”

重新启动后两者cupsavahi-daemon和标识与打印机lpstat -p和与启用cupsenable,我能够再次打印。仅重新启动cups并启用并不能解决问题。

我也将默认策略更改为retry-job,最后最终避免了以后使用cronjob出错:

* * * * * lpstat -p |grep "poissa käytöstä" && service avahi-daemon restart; service cups restart; cupsenable HP_Tuloostin

这里poissa käytöstä是维护芬兰的本地化文本“乱序”的HP_Tuloostin是我的打印机的名称。

以我的经验,默认策略和当前打印机策略都应配置为重试作业。默认策略只是在安装新打印机时获得的策略。


2
ls /etc/cups/ppd/ |cut -d "." -f1 |grep -v VMware |xargs -i cupsenable {}

该列表列出了代表已安装打印机的所有ppd文件,切断了ppd扩展名,忽略了许多VMware服务器中包含的VMware ppd(​​如果您不需要,只需删除|grep -v VMware),然后将其他名称传递给xargs所有其他名称打印机。

计划任务应使这项工作顺利进行。


1

如果问题归结于GUI需要登录才能恢复打印机的事实,那么另一种解决方案是允许通过GUI恢复打印机而无需登录。为此,请关闭杯子并编辑以下行sudo vi /etc/cups/cupsd.conf

<Limit Pause-Printer Resume-Printer Enable-Printer Disable-Printer Pause-Printer-After-Current-Job Hold-New-Jobs Release-Held-New-Jobs Deactivate-Printer Activate-Printer Restart-Printer Shutdown-Printer Startup-Printer Promote-Job Schedule-Job-After Cancel-  Jobs CUPS-Accept-Jobs CUPS-Reject-Jobs>

并删除该Resume-Printer指令,然后重新启动杯子。如果该指令出现在多个<Limit>部分中,则可以将其从相关<Policy>部分中删除或从所有部分中删除。现在,您无需从GUI登录就可以恢复打印机。我在macworld上看到了这一点,但它适用于所有杯子安装。


1

上面来自Janne的答案,例如:

* * * * * lpstat -p |grep "poissa käytöstä" && service avahi-daemon restart; service cups restart; cupsenable HP_Tuloostin

...将导致CUPS每分钟重新启动,而不管任何打印机处于什么状态。这是因为cups restart子句未与&&配对。

这是一个简短的BASH脚本,我用来在检测到故障状态时重新启动CUPS。

#!/bin/bash

DATE=$(date)
DS40=$(/usr/bin/lpstat -p |grep "DS40" |grep "disabled")

if [ ! -z "${DS40}" ]; then
    echo "${DATE} - Restarted avahi and cups" >> /var/log/cups/restart-cron-tim.log
    /usr/sbin/service avahi-daemon restart
    /usr/sbin/service cups restart
    /usr/sbin/cupsenable Dai_Nippon_Printing_DS40
fi

用要查找其状态的任何打印机替换“ DS40”,并用您所用语言的任何lpstat -p输出替换“ disabled”。


0

我用以下行更新cupsd.conf:

ErrorPolicy中止工作

然后我使用以下命令重新启动cupsd:/etc/init.d/cups restart

但是当我查看printers.conf文件时,ErrorPolicy没有更新。根据杯子的文档,“ ErrorPolicy abort-job”行必须出现在打印机部分。

我也尝试使用lpadmin更新ErrorPolicy。没有更改ErrorPolicy的任何内容,或者没有将其更改为printers.conf文件。

我想念什么?如何确保cupsd实际上因错误而中止工作?


编辑printers.conf
KawaiKx 2014年

0

lpadmin -p p-go-avtom2 -v p-go-avtom2 -E

资源


5
仔细解释一下这是什么意思吗?请添加更多上下文。
slhck

0

这里的许多解决方案对我都不起作用(例如sudo cupsenable和lpadmin -E)。

如果您使用的是Debian 8.6,则Cinnamon 2.2.16(Linux)从GUI开始菜单执行此操作:

Click Administration | Print Settings,
Then select your stalled CUPS printer,
Click Unlock (and give it your admin password),
Click Server | Settings,
In this click the blue "Problems?" link. 

对于Ubuntu 16.04:

Click System Settings | Printers,
Then Server | Settings,
Click the blue "Problems?" link. 

这将打开打印疑难解答。它将告诉您下一步该怎么做。

可能您只需要在“打印设置”中检查CUPS打印机的“已启用”属性即可。(您需要先解锁)。

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

为我修复它!

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

(关于此的我的其他帖子。)


0

在这里不得不处理相同的CUPS废话...对我来说,解决方案是每n分钟运行一次systemd脚本。

/usr/local/cups/enable_cups_printers.sh

#!/bin/sh
for printer in $(lpstat -v | perl -pe 's/device for ([A-Za-z0-9_]+):.*/\1/g')
do
    echo "Forcely enabling printer: $printer"
    # Enable:-E PrinterId:-p
    /usr/bin/lpadmin -E -p "$printer"
done

cups.enable.printers.service

[Unit]
Description = Forcely enable printer occassionally. Why CUPS disables printers in the first place has yet to be determined.

[Service]
Type = simple
ExecStart = /usr/local/cups/enable_cups_printers.sh

[Install]
WantedBy = multi-user.wants

cups.enable.printers.timer

[Unit]
Description=Run enable printers frequently to ensure connection difficulties are remedied.

[Timer]
OnBootSec=15min
OnUnitActiveSec=300

[Install]
WantedBy = timers.target

-1

正如其他人已经说过的那样,“ cupsenable”或“ lpadmin -E”应该可以解决问题。

一个相关的问题是IIRC,默认情况下,CUPS会配置打印机,以便如果以某种方式打印作业失败,则会禁用打印机。您可以更改此项以中止作业。


-1,因为-E用于加密。
椭圆视图

在上面的另一个答案中,了解如何正确使用-E作为打印机选项,而不是lpadmin选项。
椭圆视图
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.