我在 ARM 单板计算机上使用 CUPS 通过网络共享 USB 打印机。为了节省电力,打印机通常通过远程控制电源插座关闭电源,仅在需要时通过网络界面打开。通电后,打印机大约需要半分钟时间进行初始化并准备好接受打印作业。
即使打印机已关闭或仍在初始化,CUPS 也会将打印机显示为“空闲”和“就绪”,但lsusb
在打印机仍处于不可用状态时不会显示打印机。
我想要一种方法来判断打印机在发送打印作业之前是否已开机并初始化(如果打印机不可用,则可能会挂起或掉落)。
答案1
结果 CUPS 提供了命令cupsreject
并将cupsaccept
打印机标记/取消标记为不可用(因此它将在打印对话框中显示为灰色)。cupsreject
还接受带有字符串的可选-r
参数,该字符串给出了打印机不可用的原因。
结合udev
打印机连接到 USB 端口(或开机)和断开连接(关机)时执行的两条规则,这使我们能够将打印机标记为“已断开连接”,并在所有访问该端口的计算机上显示该状态通过网络打印机:
/etc/udev/rules.d/usb-printer.rules
:
ACTION=="add", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ENV{ID_VENDOR_ID}=="03f0", ENV{ID_MODEL_ID}=="0917", RUN+="/usr/sbin/cupsaccept HP_LaserJet_3330"
ACTION=="remove", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ENV{ID_VENDOR_ID}=="03f0", ENV{ID_MODEL_ID}=="0917", RUN+="/usr/sbin/cupsreject -r 'udev: Printer not connected' HP_LaserJet_3330"
对于想要将此解决方案适应自己的系统的人来说,有一些注意事项:
- 规则文件名的“usb-printer”部分是任意的,但
udev
如果文件名不以.rules
. - USB 供应商和产品 ID(在本例
0x03f0
中0x0917
)必须更改为打印机的 ID,如 所示lsusb
。 cupsaccept
为和命令指定的打印机名称cupsreject
必须与 CUPS 使用的名称相匹配。您可以使用 列出已安装的打印机lpstat -v
。