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

Sta*_*ani 51 linux shell printing cups

我的 CUPS 打印机由于驱动程序问题(HP 1010)不时进入暂停状态。

我想编写一个每小时执行一次的 shell 脚本来恢复 CUPS 中的打印机。但是在谷歌搜索几分钟后我不知道如何从 shell 命令行恢复打印机。

Dav*_* V. 75

有 cupsenable 命令。

cupsenable printer

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

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


Kur*_*fle 26

您的问题可以通过不同的方式解决,具体取决于您运行的 CUPS 版本。

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

    ErrorPolicy abort-job  
    ErrorPolicy retry-job  
    ErrorPolicy retry-this-job  
    ErrorPolicy stop-printer  
    
    Run Code Online (Sandbox Code Playgroud)

    解释:

    • 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 BackEnd Handlerbeh是一个可以应用于任何 CUPS 后端的包装器。

    假设您的打印队列当前定义了一个后端socket://192.168.1.111:9100,并且它以您不喜欢的方式运行(由于网络连接问题不时被cupsd 禁用)。随着beh你重新定义你的后台是这样的:

    beh:/0/20/120/socket://192.168.1.111:9100
    
    Run Code Online (Sandbox Code Playgroud)

    这将在两分钟的时间间隔内重试作业 20 次,并仅在仍未成功时禁用队列。或者你可以这样做:

    beh:/1/3/5/socket://192.168.1.111:9100
    
    Run Code Online (Sandbox Code Playgroud)

    这将重试作业 3 次,两次尝试之间有 5 秒的延迟。如果作业仍然失败,则将其丢弃,但不会禁用队列。您想让 cupsd 无限期地尝试连接到设备吗?好,试试这个:

    beh:/1/0/30/socket://192.168.1.111:9100
    
    Run Code Online (Sandbox Code Playgroud)

    无限尝试直到打印机恢复。连接尝试之间的间隔为 30 秒。打印机关闭时作业不会丢失。您可以通过关闭打印机来故意延迟打印。适合桌面打印机和/或家庭用户的良好配置。


总体而言,没有必要更动的bash脚本,cron作业,lpadmincupsenable或者sudo为了重新激活CUPS队列下去不正常。


Den*_*son 10

使用的-E打印机选项lpadmin应该这样做。

lpadmin [-U username ] [ -h server[:port] ] -p printer option(s)
Run Code Online (Sandbox Code Playgroud)

正如下面的评论中指出的那样,请确保-E在打印机名称之后添加,因为这里是打印机选项,而不是lpadmin选项。请注意该man lpadmin页面的以下摘录:

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

如果问题反复出现,您可能可以使用该lpadmin命令创建一个 CRON 作业。每小时cron入场:

0 * * * * /usr/sbin/lpadmin -p your_printer -E
Run Code Online (Sandbox Code Playgroud)

您可以通过运行来添加它:

sudo crontab -e
Run Code Online (Sandbox Code Playgroud)

  • 这是错误的。-E 在此上下文中是一个打印机选项,必须在打印机名称之后,否则您只是打开了通信加密。https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man8/lpadmin.8.html -- 在 -d、-p 或 -x 选项之前指定时,-E 选项连接到服务器时强制加密。 (3认同)

小智 6

我的打印机是 HP CP1215 也有错误:打印机暂停 - “/usr/lib/cups/backend/hp failed”

重新启动后两者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
Run Code Online (Sandbox Code Playgroud)

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

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