系统管理指南:打印

自定义的打印机接口程序

如果标准打印机接口程序不支持您的打印机,则可以提供您自己的打印机接口程序。可以复制标准程序,然后指示 LP 打印服务将它用于指定的打印机。首先,需要了解标准程序中的内容。下一节将介绍标准程序。

打印机接口程序应执行以下任务:


注意 – 注意 –

如果打印机接口程序是早于发行版 3.2 的 UNIX System V 发行版中的打印机接口程序,则它可能适用于 SunOS 5.10 或兼容的 LP 打印服务。但是,在 SunOS 5.10 或兼容的 LP 打印服务中有几个 -o 选项已标准化。这些选项会传递到每个打印机接口程序。它们可能会干扰旧接口使用的具有类似名称的选项。


LP 打印服务(而非打印机接口程序)负责打开打印机端口。打印机端口作为标准输出提供给打印机接口程序。此外,对于打印机接口程序,打印机会标识为“控制终端”,以便在端口“挂起”时将 SIGHUP 信号发送到打印机接口程序。

标准打印机接口程序

标准(模型)打印机接口程序是 /usr/lib/lp/model/standard。LP 打印服务使用该程序设置下表所示的打印缺省值。

表 7–2 缺省的打印机端口特征

特征 

缺省设置 

缺省过滤器 

None

字符间距 

None

行间距 

None

页宽 

None

页长 

None

字符集 

None

stty 选项

9600 cs8 -cstopb -parenb -parodd ixon -ixany opost -olcuc onlcr -ocrnl -onocr -onlret -ofill nl0 cr0 tab0 bs0 vt0 ff0

退出代码

0

自定义 stty 模式

如果需要更改终端特征(如波特率或输出选项),请查找标准打印机接口程序中以下列注释开始的部分:

## Initialize the printer port

有关更多信息,请参见调整打印机的端口特征

退出代码

当打印完成时,接口程序应以显示打印作业状态的代码退出。退出代码是打印机接口程序中的最后一项。

下表说明了退出代码以及 LP 打印服务如何解释它们。

表 7–3 打印机接口程序的退出代码

退出代码 

LP 打印服务的解释 

0

打印请求已成功完成。如果打印机曾出现故障,则该故障已清除。 

1 - 127

打印请求时遇到了问题。例如,有太多非打印字符,或者请求超出打印机功能。LP 打印服务通知提交请求的人员,在打印该请求时出现了错误。此错误不影响将来的打印请求。如果打印机曾出现故障,则该故障已清除。 

128

此代码是保留的,供 LP 打印服务使用。接口程序不得以此代码退出。 

129

在打印请求时打印机出现故障。此故障不影响将来的打印请求。如果打印机的故障恢复指示 LP 打印服务等待管理员更正问题,则 LP 打印服务禁用打印机。如果故障恢复是继续打印,则 LP 打印服务不禁用打印机。但是,打印服务将在几分钟后再次尝试打印。 

>129

这些代码是保留的,供 LP 打印服务使用。接口程序不得以此范围内的代码退出。 

如果程序以代码 129 退出,则提醒 root 打印机出现了故障。在清除故障之后,LP 打印服务也必须从头开始重新打印请求。如果不希望重新打印整个请求,则可以使接口程序将故障消息发送到 LP 打印服务。(首先等待清除故障。)在清除故障后,接口程序可以恢复打印文件。完成打印时,打印机接口程序可以提供退出代码 0,就好像从未出现故障。此方法的其他优点: 接口程序可以检测到自动清除故障的时间。这样,管理员就不需要重新启用打印机。

故障消息

可以使用 lp.tell 程序将故障消息发送到 LP 打印服务。此程序由标准打印机接口代码中的 LPTELL shell 变量引用。此程序接收标准输入并将它发送到 LP 打印服务。LP 打印服务将标准输入置于警告管理员打印机出现故障的消息中。如果 lp.tell 程序的标准输入为空,则它不启动警报。有关如何使用 lp.tell 程序的示例,请查看紧跟以下注释的标准打印机接口代码:

# Set up the $LPTELL program to capture fault messages here

如果使用特殊的退出代码 129lp.tell 程序,则打印机接口程序无需禁用打印机本身。接口程序可以直接禁用打印机。但是,这样做将覆盖故障报警机制。仅当 LP 打印服务检测到打印机出现故障,而且特殊的退出代码和 lp.tell 程序是其主要检测工具时,才发送警报。

如果 LP 打印服务必须随时中断文件的打印,则它将使用信号 TERM(陷阱号 15)中止接口程序。有关更多信息,请参见 kill(1)signal(3C) 手册页。如果打印机接口程序由于接收到任何其他信号而中止,则 LP 打印服务会假定以后的打印请求不受影响。因此,LP 打印服务继续使用打印机。LP 打印服务将通知提交请求的用户,说明请求尚未成功完成。

首次调用接口时,将忽略信号 HUP、INT、QUIT 和 PIPE(陷阱号分别为 1、2、3 和 13)。标准接口更改此缺省行为,以便在适当的时间捕获信号。标准接口将接收到这些信号解释为打印机出现问题的警告。当标准接口收到信号时,它将发出故障警报。

使用自定义的打印机接口程序

可以创建自定义的打印机接口程序,并在打印服务器上使用它来代替标准打印机接口程序。为此,请使用 lpadmin 命令为特定打印机向 LP 打印服务注册该程序。

Procedure如何设置自定义的打印机接口程序

  1. 在打印服务器上以超级用户 lp 或同等角色的身份登录。

  2. 复制标准打印机接口程序。


    # cp /var/spool/lp/model/standard  custom-interface
    
  3. (可选的)如果已具有自定义的打印机接口程序,请转到步骤 5

  4. 更改标准打印机接口程序的副本以满足您的需要。

    请参阅标准打印机接口程序中对程序的说明,以确定需要进行哪些更改。

  5. 为特定打印机设置自定义的打印机接口程序。


    # lpadmin -p printer-name -i custom-interface
    
    -p

    指定使用自定义的打印机接口程序的打印机。

    -i

    是自定义的打印机接口程序的名称。

    已向 LP 打印服务注册自定义的打印机接口程序,该程序将在用户提交打印请求时由该打印机使用。

  6. 验证是否在 /etc/lp/printers/printer-name/configuration 文件中添加了自定义的打印机接口程序。


示例 7–3 设置自定义的打印机接口程序

此示例说明如何为打印机 luna 设置名为 custom 的自定义打印机接口程序。


# lpadmin -p luna -i custom


示例 7–4 复制自定义的打印机接口程序

此示例说明如何将自定义的打印机接口程序从打印机 venus 复制到打印机 asteroid


# lpadmin -p asteroid -e venus