11.7. 查错

下面几节介绍一些最常遇到的打印机硬件和软件问题以及解决或避免这些问题的方法。

11.7.1. 打印机没有标准打印机语言支持

不支持任何常用打印机语言并且只能使用特殊控制序列处理的打印机被称为 GDI 打印机。这些打印机只能用于制造商提供了驱动程序的操作系统版本。GDI 是 Microsoft 为图形设备开发的编程接口。实际问题不是编程接口,而是 GDI 打印机只能通过相应打印机型号的专用打印机语言进行处理。

某些打印机可进行切换以 GDI 方式或一种标准打印机语言进行操作。某些制造商为他们的 GDI 打印机提供专有驱动程序。专有打印机驱动程序的缺点在于不能保证这些驱动程序可用于已安装的打印系统,也不能保证它们适合各种硬件平台。相反,支持标准打印机语言的打印机不依赖于特殊的打印系统版本或特殊的硬件平台。

与其花时间使专有 Linux 驱动程序工作,不如购买一台支持的打印机,这样更经济一些。这可以一次性全部解决驱动程序问题,从而无需安装并配置特殊驱动程序软件,也无需获取由于打印系统中开发的新功能而必须安装的驱动程序更新。

11.7.2. 没有合适的 PPD 文件可用于 PostScript 打印机

如果 manufacturer-PPDs 包不包含任何用于 PostScript 打印机的合适 PPD 文件,则可以使用打印机制造商提供的驱动程序 CD 上的 PPD 文件或从打印机制造商万维网网页下载合适的 PPD 文件。

如果以 zip 存档 (.zip) 或自解压缩 zip 存档 (.exe) 的形式提供 PPD 文件,则用 unzip 命令将其解包。首先,查看 PPD 文件的许可协议条款。然后,使用 cupstestppd 实用程序检查该 PPD 文件是否符合“Adobe PostScript 打印机描述文件格式规范(版本 4.3)”。如果该实用程序返回“FAIL”,则 PPD 文件中的错误非常严重,很可能导致严重问题。应该解决 cupstestppd 报告的问题点。如果需要,询问打印机制造商是否提供合适的 PPD 文件。

11.7.3. 并行端口

最安全的方法是将打印机直接连接到第一个并行端口并在 BIOS 中选择以下并行端口设置:

  • I/O 地址:378(十六进制)

  • 中断:无关

  • 方式:NormalSPPOutput Only

  • DMA:已禁用

如果即便进行了这些设置仍无法对并行端口上的打印机进行寻址,则按照 BIOS 中的设置在 /etc/modprobe.conf 中以 0x378 形式显式输入 I/O 地址。如果有两个并行端口,分别被设置为 I/O 地址 378278(十六进制),则以 0x378,0x278 形式输入这两个端口。

如果中断 7 可用,则可以用 例 11.1 “/etc/modprobe.conf:第一个并行端口的中断方式” 中显示的项将其激活。在激活中断方式之前,检查文件 /proc/interrupts 看看哪些中断仍在使用中。只显示当前正在使用的中断。根据哪些硬件部件处于活动状态,这可能会有所变化。用于并行端口的中断一定不能被任何其它设备使用。如果您不确定,则使用巡回检测方式,设置 irq=none

例 11.1. /etc/modprobe.conf:第一个并行端口的中断方式

alias parport_lowlevel parport_pc
options parport_pc io=0x378 irq=7

11.7.4. 网络打印机连接

确定网络问题

将打印机直接连接到计算机。出于测试目的,将该打印机配置为本地打印机。如果打印机可以工作,则问题与网络有关。

检查 TCP/IP 网络

TCP/IP 网络和名称解析必须可以正常工作。

检查远程 lpd

使用以下命令测试是否可以与 host 上的 lpd(端口 515)建立 TCP 连接:

netcat -z host 515 && echo ok || echo failed

如果不能建立与 lpd 的连接,则 lpd 可能不处于活动状态或可能存在基本网络问题。

root 用户身份使用以下命令查询远程 hostqueue 的状态报告(可能非常长),前提是相应的 lpd 处于活动状态并且主机接受查询:

echo -e "\004queue" \
  | netcat -w 2 -p 722 host 515

如果 lpd 不响应,则它可能不处于活动状态或可能存在基本网络问题。如果 lpd 响应,响应应该显示为什么在 hostqueue 上不能进行打印。如果您接收到类似 例 11.2 “来自 lpd 的错误讯息” 中的响应,则问题是由远程 lpd 引起的。

例 11.2. 来自 lpd 的错误讯息

lpd: your host does not have line printer access
lpd: queue does not exist
printer: spooling disabled
printer: printing disabled
检查远程 cupsd

默认情况下,CUPS 网络服务器应该每隔 30 秒在 UDP 端口 631 上广播其队列。因此,以下命令可用于测试网络中是否有 CUPS 网络服务器。

netcat -u -l -p 631 & PID=$! ; sleep 40 ; kill $PID

如果广播 CUPS 网络服务器存在,则输出如例 11.3 “来自 CUPS 网络服务器的广播”所示。

例 11.3. 来自 CUPS 网络服务器的广播

ipp://host.domain:631/printers/queue

以下命令可用于测试是否可以与 host 上的 cupsd(端口 631)建立 TCP 连接:

netcat -z host 631 && echo ok || echo failed

如果不能建立与 cupsd 的连接,则 cupsd 可能不处于活动状态或可能存在基本网络问题。lpstat -h host -l -t 返回 host 上所有队列的状态报告(可能非常长),前提是相应的 cupsd 处于活动状态并且主机接受查询。

下一个命令用于测试 host 上的 queue 是否接受由单个回车字符组成的打印作业。不应打印任何内容。可能会弹出一页空白纸。

echo -en "\r" \
  | lp -d queue -h host
对网络打印机或打印服务器计算机进行查错

当在打印服务器计算机中运行的假脱机程序要处理大量打印作业时,有时会导致出现问题。因为这是由打印服务器计算机中的假脱机程序引起的,所以没什么办法。作为替代解决方法,可以直接通过 TCP 套接字对连接到打印服务器计算机的打印机进行寻址来绕过打印服务器计算机中的假脱机程序。请参见第 11.4.2 节 “网络打印机”

这样,打印服务器计算机仅用作数据传送(TCP/IP 网络和本地打印机连接)各种不同形式之间的转换器。要使用此方法,您需要知道打印服务器计算机上的 TCP 端口。如果打印机连接在打印服务器计算机上并且打开了电源,则通常可以在打开打印服务器计算机的电源后使用 nmap 包中的 nmap 实用程序确定此 TCP 端口。例如,nmap IP-address 可能会传递打印服务器计算机的以下输出:

Port       State       Service
23/tcp     open        telnet
80/tcp     open        http
515/tcp    open        printer
631/tcp    open        cups
9100/tcp   open        jetdirect

此输出指出可以在端口 9100 上通过 TCP 套接字对连接到打印服务器计算机的打印机进行寻址。默认情况下,nmap 只检查在 /usr/share/nmap/nmap-services 中列出的一些常见的端口。要检查所有可能的端口,请使用命令 nmap -p from_port-to_port IP-address。这可能要花一些时间。有关详细信息,请参考 nmap 手册页。

输入如下命令

echo -en "\rHello\r\f" | netcat -w 1 IP-address port
cat file | netcat -w 1 IP-address port

将字符串或文件直接发送到相应的端口以测试是否可以在该端口上对打印机进行寻址。

11.7.5. 打印件有问题但没有错误讯息

对于打印系统,打印作业完成的标志是 CUPS 后端完成到接收方(打印机)的数据传送。如果在接收方的进一步处理失败(例如,如果打印机无法打印打印机特定的数据),则打印系统不会对此进行通知。如果打印机无法打印打印机特定的数据,则选择另一个更适合该打印机的 PPD 文件。

11.7.6. 禁用的队列

如果向接收方传送数据在多次尝试后都失败,则 CUPS 后端(例如 usbsocket)向打印系统(向 cupsd)报告一个错误。后端决定在报告数据传送无法完成之前是否继续尝试以及进行多少次尝试。由于继续尝试可能也是徒劳,cupsd 将禁用相应队列的打印。在消除了问题的起因后,系统管理员必须使用 /usr/bin/enable 命令重启用打印。

11.7.7. CUPS 浏览:删除打印作业

如果 CUPS 网络服务器通过浏览向客户机主机广播其队列并且客户机主机上合适的本地 cupsd 处于活动状态,则客户机 cupsd 接受来自应用程序的打印作业并将它们转发到服务器上的 cupsd。当 cupsd 接受打印作业后,会为该作业指派一个新的作业号。因此,客户机主机上的作业号与服务器上的作业号不同。因为通常都将打印作业立即转发,所以不能用客户机主机上的作业号将其删除,原因是一旦将打印作业转发到服务器 cupsd,客户机 cupsd 就会将打印作业视为已完成。

要在服务器上删除打印作业,使用命令(例如 lpstat -h print-server -o)确定服务器上的作业号,前提是服务器尚未完成该打印作业(即尚未将其发送到打印机)。使用此作业号,可以删除服务器上的打印作业:

cancel -h print-server queue-jobnnumber

11.7.8. 有问题的打印作业和数据传送错误

如果打印进程中将打印机关闭或关闭计算机,则打印作业保留在队列中,当打开打印机或重引导计算机后,打印继续。必须使用 cancel 从队列中去除有问题的打印作业。

如果打印作业有问题或主机和打印机之间的通讯出现错误,则打印机会打印出很多张带有乱码的纸张,这是因为它不能正确处理数据。要解决此问题,请执行以下步骤:

  1. 要停止打印,请将所有纸张从喷墨打印机中取出或打开激光打印机的纸盒。高质量的打印机具有一个用于取消当前打印件的按钮。

  2. 打印作业可能仍在队列中,因为只有在将作业完全发送到打印机后才会将它们去除。使用 lpstat -olpstat -h print-server -o 检查哪个队列当前正在打印。使用 cancel queue-jobnumbercancel -h print-server queue-jobnumber 删除打印作业。

  3. 即使已将打印作业从队列中删除,某些数据仍会被传送到打印机。检查 CUPS 后端进程是否仍在为相应的队列运行并将其终止。例如,对于连接到并行端口的打印机,可以使用命令 fuser -k /dev/lp0 终止仍在访问打印机的所有进程(更准确地说:是并行端口)。

  4. 通过关闭打印机一段时间完全重设置打印机。然后插入纸张并打开打印机。

11.7.9. 对 CUPS 打印系统进行调试

使用以下通用过程确定 CUPS 打印系统中的问题:

  1. /etc/cups/cupsd.conf 中设置 LogLevel debug

  2. 停止 cupsd

  3. 去除 /var/log/cups/error_log* 从而无需搜索非常长的日志文件。

  4. 启动 cupsd

  5. 重复导致问题的操作。

  6. 检查 /var/log/cups/error_log* 中的讯息以确定问题的原因。

11.7.10. 参考信息

SUSE 支持数据库中提供了对许多特定问题的解决方案 (http://portal.suse.com/)。使用关键字搜索找到相关文章。