系统管理指南:打印

自定义打印服务(任务图)

任务 

说明 

参考 

添加不支持打印机的 terminfo 项。

terminfo 数据库中添加项,以初始化不支持的打印机并建立必需的设置。

如何为不支持的打印机添加 terminfo

设置自定义的打印机接口程序。 

如果有标准打印机接口程序不支持的打印机,则可以提供自定义的打印机接口程序。 

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

调整打印机的端口特征。 

使 LP 打印服务设置的打印机端口特征与打印机通信设置兼容。  

如何调整打印机的端口特征

自定义 LP 打印服务

虽然 LP 打印服务旨在提供充分的灵活性,以处理大多数打印机和打印需求,但是 LP 打印服务并不能处理每种可能的情况。您可能有 LP 打印服务的标准功能无法满足的打印请求。或者,您的打印机可能无法很好地适应 LP 打印服务处理打印机的方式。

您可以采用以下方式自定义 LP 打印服务:

调整打印机的端口特征

由 LP 打印服务设置的打印机端口特征必须与打印机通信设置兼容。如果 LP 打印服务提供的缺省打印机端口设置对打印机不起作用,请参阅生产商提供的打印机手册,以确定打印机要求 LP 打印服务进行哪些设置。使用 stty 命令可以设置和显示打印机通信设置。

下表显示了 LP 打印服务使用的缺省 stty 设置。

表 7–1 LP 打印服务使用的缺省 stty 设置

选项 

说明 

-9600

将波特率设置为 9600 

-cs8

设置 8 位字节 

-cstopb

为每个字节发送一个停止位 

-parity

不生成奇偶校验 

-ixon

启用 XON/XOFF(也称为 START/STOP 或 DC1/DC3) 

-opost

使用此表中后面的所有设置执行“输出后处理” 

-olcuc

不将小写映射为大写 

-onlcr

将换行符更改为回车/换行符 

-ocrnl

不将回车更改为换行符 

-onocr

即使在 0 列也输出回车 

-n10

在换行符之后不提供延迟 

-cr0

在回车之后不提供延迟 

-tab0

在制表符之后不提供延迟 

-bs0

在退格符之后不提供延迟 

-vt0

在垂直制表符之后不提供延迟 

-ff0

在换页符之后不提供延迟 

Procedure如何调整打印机的端口特征

  1. 成为超级用户或同等角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”

  2. 调整打印机的端口特征。


    # lpadmin -p printer-name -o "stty=options"
    
    -p

    指定要调整其端口特征的打印机名称。

    -o "stty=options"

    设置由 options 指定的端口特征(stty 选项)。可以使用此命令更改多个 stty 选项设置。用单引号将每个选项引起来,并用空格分隔各选项。有关选项的完整列表,请参见 stty(1) 手册页。表 7–1 给出了 LP 打印服务使用的缺省 stty 设置。

  3. 验证是否已更改打印机的端口特征。


    # lpstat -p printer-name -l
    

示例 7–1 调整打印机的端口特征

此示例说明如何设置打印机 luna 的端口特征。parenb 选项启用奇偶校验/生成。parodd 选项设置奇数奇偶校验生成。cs7 选项将字符大小设置为 7 位。


# lpadmin -p luna -o "stty='parenb parodd cs7'"


示例 7–2 设置终端波特率

此示例说明如何将打印机 venus 的终端波特率设置为 19200。


# lpadmin -p venus -o "stty=19200"

为不支持的打印机添加 terminfo

LP 打印服务使用接口程序和 terminfo 数据库,初始化每台打印机并建立以下设置:

每台打印机在 terminfo 数据库中使用短名称标识。terminfo 数据库要求的短名称与用于设置 TERM shell 变量的名称完全相同。此名称也是在设置打印机时指定的打印机类型。例如,不同类型 PostScript 打印机的项位于 /usr/share/lib/terminfo/P 目录中。SunOS 软件发行版提供的缺省项是 PS(用于 PostScript)和 PSR(用于 PostScript Reverse)。

如果找不到打印机的 terminfo 项,仍可以通过 LP 打印服务使用打印机,但不会自动选择页面大小、间距和字符集。但是,可能无法使每个打印请求的打印机设置保持为正确的模式。

如果不存在与您的打印机类型对应的 terminfo 项,并且您希望以正确模式设置该打印机,则可以执行以下操作之一:

terminfo 数据库中的终端或打印机项包含并定义了数百个项。但 LP 打印服务只使用其中不到 50 个项。有关打印机所需的 terminfo 项目的更多信息,请参见打印机必需的 terminfo

Procedure如何为不支持的打印机添加 terminfo


注 –

在创建打印机的 terminfo 项之前,请确保现有的 terminfo 项都不支持该打印机。为此,请尝试用类似打印机的项设置该打印机(如果存在类似打印机)。


  1. 成为超级用户或同等角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”

  2. 确定打印机 terminfo 项的名称。

    /usr/share/lib/terminfo 目录中的目录包含所有有效 terminfo 项。将这些项作为选择打印机名称的指南。

  3. 为打印机创建 terminfo 项文件。

    表 12–6 给出了必须在 terminfo 项中定义以将新打印机添加到 LP 打印服务的项。有关 terminfo 数据库结构的更多详细信息,请参见 terminfo(4) 手册页。

    要开始编写新的 terminfo 项,请使用 infocmp 命令将现有的 terminfo 项保存到文件中。如果有一个 terminfo 项与要创建的项类似,则此命令将非常有用。例如,以下命令将 ps 项保存到 ps_cust 文件(它将成为新的 terminfo 项)。

    infocmp ps > ps_cust

  4. terminfo 项文件编译到 terminfo 数据库中。


    # tic terminfo_entry
    

    其中 terminfo-entry 变量是您创建的 terminfo 项文件。

  5. 检查新的 terminfo 项文件是否在 /usr/share/lib/terminfo 目录中。

自定义的打印机接口程序

如果标准打印机接口程序不支持您的打印机,则可以提供您自己的打印机接口程序。可以复制标准程序,然后指示 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