代码改变世界

openEuler 系统打印机故障排查全记录:从"等待处理"到成功出纸

2026-07-30 11:09  taozsay  阅读(12)  评论(0)    收藏  举报

背景

在使用 openEuler 系统对接 GODEX G500 标签打印机的过程中,先后遇到了打印任务卡在队列、打印机被禁用、任务"处理完成"却不出纸等一系列问题。整个排查过程涉及 CUPS 服务、驱动配置、指令集匹配等多个层面,这里把完整的排查思路和解决步骤记录下来,方便日后查阅,也希望能帮到遇到类似问题的朋友。

环境说明

  • 操作系统:openEuler
  • 打印服务:CUPS
  • 打印机型号:GODEX G500(标签/条码打印机)
  • 连接方式:USB 直连

问题一:打印任务一直卡在队列,状态"等待处理"

现象

提交打印任务后,任务长时间停留在队列里,状态显示为 pending(等待处理),既不报错也不出纸。

排查思路

先确认打印机本身的状态:

lpstat -p -d

如果打印机被标记为 disabled,需要重新启用:

cupsenable 打印机名称
cupsaccept 打印机名称

同时可以查看更详细的错误原因:

lpstat -l -p 打印机名称

以及实时的 CUPS 错误日志,这是定位问题最直接的方式:

sudo tail -f /var/log/cups/error_log

常见成因排查清单

  • 打印机离线:确认 USB 连接或网络连通性
  • 驱动不匹配:卡队列却不报错,往往是驱动版本或类型选错
  • SELinux 拦截:openEuler 默认开启 SELinux,可临时切换宽容模式验证:
    getenforcesudo setenforce 0
    
    如果切换后能正常打印,说明是 SELinux 策略问题,需要针对性配置策略,而不是长期关闭
  • CUPS 服务假死
    sudo systemctl restart cups
    

问题二:打印机显示"被禁用"

现象

执行 lpstat -l -p 查看时,输出显示打印机从某个时间点开始被禁用,具体提示为:

无法向打印机发送数据。

分析

CUPS 在多次发送数据失败后,会自动禁用打印机以避免任务持续堆积。由于当前连接方式是"直接"(Direct,即 USB),问题大概率出在物理连接或系统识别层面,而不是网络配置。

排查步骤

1. 检查系统是否识别到 USB 设备

如果系统提示 lsusb: 未找到命令,说明没有安装 usbutils 工具包:

sudo dnf install usbutils
lsusb

安装后再次查看输出中是否有 GODEX 相关设备信息。

2. 确认 CUPS 探测到的打印机接口

lpinfo -v

3. 检查设备节点权限

确认 lp 用户组对打印机设备节点有读写权限。

4. 重新启用并测试

sudo cupsenable 打印机名称
echo "test" | lp -d 打印机名称

问题三:任务"处理完成"却不出纸

这是整个排查过程中最容易让人误判的一环,专门拿出来说一下。

现象

生产环境验证时,打印机状态显示空闲(idle)、无警告,一切看起来正常:

打印机 G500 目前空闲。启用中,警告:none

提交测试任务:

echo "test" | lp -d G500

返回:

请求 ID 为 G500-143(0 个文件)

随后查看队列:

lpstat -o G500

没有任何输出——任务已经从队列消失,说明 CUPS 认为处理完成了,但打印机没有实际出纸

根本原因

GODEX G500 是标签/条码打印机,需要的是专用的打印指令语言(如 EZPL/GEPL 指令集),而不是普通的纯文本。用 echo "test" | lp 发送的仅仅是一行纯文本,经过 CUPS 过滤器链转换后,很可能因为内容过于简单或格式不匹配,没有生成打印机能识别的有效指令。结果就是:

  • CUPS 层面:任务已发送,队列清空,视为"处理完成"
  • 打印机层面:收到的数据无法解析,直接丢弃,不产生任何输出

这也是为什么"任务完成"不等于"打印成功"——CUPS 只负责把数据送到打印机接口,至于打印机认不认得这份数据,它并不关心。

排查与验证方法

1. 确认驱动是否为厂商专用驱动

lpoptions -p G500 -l
head -20 /etc/cups/ppd/G500.ppd

确认 PPD 文件中包含 gdxModegdxRatecupsDarkness 等 GODEX 专有参数,说明使用的是正规厂商驱动,而非通用驱动,驱动本身没有问题。

2. 用真实文件而非管道测试

echo "Hello World Test Label" > /tmp/test.txt
lp -d G500 /tmp/test.txt

3. 查看已完成任务历史

lpstat -W completed -o G500

4. 重点排查 CUPS 过滤器链是否报错

打印前后对比日志,能精准定位是哪一环过滤器(如文本转光栅、光栅转标签指令)出的问题:

sudo tail -50 /var/log/cups/error_log

5. 检查介质与浓度设置

确认打印机实际装载的标签纸尺寸与 PPD 中的 PageSize 设置一致,同时检查打印浓度(Darkness)参数,浓度过低即使打印成功也可能几乎看不出内容:

lpoptions -p G500 -o cupsDarkness=10

总结

整个排查过程按照"CUPS 服务状态 → 系统层面设备识别 → 驱动匹配 → 指令集/介质适配"的顺序层层深入,最终问题得以解决。几点经验总结:

  1. 任务从队列消失 ≠ 打印成功,尤其是标签打印机这类对指令格式有特殊要求的设备,一定要以实际出纸为准;
  2. lsusblpinfo -v 是判断"系统有没有识别到打印机"的第一道关卡,装好 usbutils 工具包能省不少事;
  3. /var/log/cups/error_log 是排查 CUPS 相关问题最直接的信息来源,遇到问题优先看日志;
  4. 对于标签/条码打印机,用简单的 echo 纯文本测试意义有限,最好用符合打印机指令集的测试数据或正式的打印文件来验证。

希望这篇记录能帮到同样在 openEuler 上折腾打印机的朋友,少走一些弯路。