標準プリンタインタフェースプログラムでサポートされないプリンタを使用する場合は、独自のプリンタインタフェースプログラムを提供できます。標準プログラムをコピーし、指定したプリンタを使用するように LP 印刷サービスに指示できます。ただし、まず標準プログラムについて理解する必要があります。次の節では、標準プログラムについて説明します。
プリンタインタフェースプログラムの機能は次のとおりです。
必要に応じてプリンタポートを初期化する。標準プリンタインタフェースプログラムは、stty コマンドを使用してプリンタポートを初期化する。
プリンタハードウェアを初期化する。標準プリンタインタフェースプログラムは、terminfo データベースと TERM シェル変数から制御シーケンスを取得する。
必要に応じてバナーページを印刷する。
印刷要求で指定された部数を印刷する。
リリース 3.2 より前の UNIX System V のプリンタインタフェースプログラムを使用している場合でも、そのプログラムは、SunOS 5.7 または互換 LP 印刷サービスで使用できます。ただし、一部の -o オプションは SunOS 5.7 または互換 LP 印刷サービスでは標準化されていて、すべてのプリンタインタフェースプログラムに渡されます。これらのオプションは、古いインタフェースで使用される同じ名前のオプションの妨げとなることがあります。
プリンタポートを開く処理は、プリンタインタフェースプログラムではなく LP 印刷サービスが受け持ちます。プリンタポートは標準出力としてプリンタインタフェースプログラムに与えられ、プリンタはプリンタインタフェースプログラムの「制御端末」として識別されるので、ポートが「ハング」するとプリンタインタフェースプログラムに SIGHUP 信号が送信されます。
LP 印刷サービスは、標準 (モデル) プリンタインタフェースプログラム /usr/lib/lp/model/standard を使用して、表 6-3 の印刷デフォルトを設定します。
表 6-3 デフォルトのプリンタポート特性
特性 |
デフォルト設定 |
---|---|
デフォルトフィルタ |
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 |
ボーレートや出力オプションなどの端末特性を変更する必要がある場合は、標準プリンタインタフェースプログラム内で、次のコメントから始まるセクションを探します。
## Initialize the printer port
印刷し終わると、インタフェースプログラムは印刷ジョブの状態を示すコードを返して終了します。終了コードは、プリンタインタフェースプログラムの最後のエントリです。
表 6-4 は、終了コードとそのコードが LP 印刷サービスでどのように解釈されるかを示しています。
表 6-4 プリンタインタフェースプログラムの終了コード
コード |
LP 印刷サービスにとっての意味 |
---|---|
0 |
印刷要求は正常に完了した。プリンタ障害が発生した場合は、クリアされた |
1 〜 127 |
要求の印刷中に問題が発生した (たとえば、印字できない文字が多すぎる、要求がプリンタの容量を超えているなど)。LP 印刷サービスは、その要求を依頼したユーザーに、印刷中にエラーが発生したことを通知する。このエラーはその後の印刷要求には影響しない。プリンタ障害が発生するとクリアされる |
128 |
このコードは、LP 印刷サービスが内部で使用するために予約されている。インタフェースプログラムは、このコードを返して終了してはいけない |
129 |
要求の印刷中にプリンタ障害が発生した。この障害は、その後の印刷要求に影響を及ぼす。プリンタの障害回復が LP 印刷サービスに管理者によって問題が解決されるまで待つように指示すると、LP 印刷サービスはプリンタを使用不可にする。障害回復後に印刷を続けようとすると、LP 印刷サービスはプリンタを使用不可にしないが、数分後にそのまま印刷しようとする |
129 より大きい場合 |
これらのコードは、LP 印刷サービスが内部で使用するために予約されている。インタフェースプログラムは、この範囲内のコードを返して終了してはいけない |
プログラムがコード 129 を返して終了すると、root はプリンタ障害を警告されます。また、LP 印刷サービスは、障害がクリアされた後に要求を最初から印刷し直さなければなりません。要求全体を印刷し直したくない場合は、インタフェースプログラムに障害メッセージを LP 印刷サービスへ送信させることもできますが、障害がクリアされるまで待つことになります。障害がクリアされると、インタフェースプログラムはファイルの印刷を再開できます。印刷が終了すると、プリンタインタフェースプログラムは障害が発生しなかった場合と同様に終了コード 0 を返すことができます。このアプローチには、障害が自動的にクリアされた場合に、それをインタフェースプログラムが検出できるので、管理者がプリンタを再び使用可能にする必要がないという利点もあります。
lp.tell プログラムを使用すると、LP 印刷サービスに障害メッセージを送信できます。このプログラムは、標準プリンタインタフェースコード内の LPTELL シェル変数によって参照されます。プログラムは標準入力を取り込んで LP 印刷サービスに送信し、LP 印刷サービスは管理者にプリンタ障害を警告するメッセージを出します。標準入力が空であれば、lp.tell は警告を開始しません。lp.tell プログラムの例として、次のコメントの直後の標準プリンタインタフェースコードを確認してください。
# Here's where we set up the $LPTELL program to capture fault messages
特殊な終了コード 129 または lp.tell プログラムを使用すると、プリンタインタフェースプログラムはプリンタ自体を使用不可にする必要がありません。インタフェースプログラムは、プリンタを直接使用不可にできますが、その場合は障害警告メカニズムが無効になります。LP 印刷サービスがプリンタ障害を検出した場合にのみ警告が送信され、特殊終了コードと lp.tell プログラムはその主要検出ツールです。
LP 印刷サービスがいずれかの時点でファイルの印刷を中断しなければならない場合は、TERM 信号 (トラップ番号 15 と、kill(1) および signal(3B) のマニュアルページを参照) を使用してインタフェースプログラムを強制終了します。プリンタインタフェースプログラムが他の信号を受信しなくなると、LP 印刷サービスはその後の印刷要求は影響されないものとみなし、そのプリンタを使用し続けます。LP 印刷サービスは、要求を依頼したユーザーに、その要求が正常に終了しなかったことを通知します。
インタフェースが最初に呼び出されると、信号 HUP、INT、QUIT、PIPE (トラップ番号 1、2、3、13) は無視されます。標準インタフェースは、信号が適切な時期にトラップされるように、この動作を変更します。標準インタフェースはこれらの信号の受信をプリンタの問題を示す警告として解釈し、信号を受信すると障害警告を発します。
カスタマイズされたプリンタインタフェースプログラムを作成し、印刷サーバー上で標準プリンタインタフェースプログラムの代わりに使用できます。そのためには、lpadmin コマンドを使用して、プログラムを特定のプリンタの LP 印刷サービスに登録します。
印刷サーバーにスーパーユーザーまたは lp としてログインします。
独自のプリンタインタフェースプログラムがあるかどうかに基づいて次の手順を選択します。
独自のプリンタインタフェースプログラムの有無 |
次の手順 |
---|---|
独自のプリンタインタフェースプログラムがないので作成する必要がある | |
すでに独自のプリンタインタフェースプログラムがある |
# cp /var/spool/lp/model/standard custom-interface
標準プリンタインタフェースプログラムのコピーを必要に応じて変更します。
詳しくは、「標準プリンタインタフェースプログラム」のプログラムの説明を参照して、何を変更する必要があるかを判断してください。
特定のプリンタ独自のプリンタインタフェースプログラムを設定します。
# lpadmin -p printer-name -i custom-interface
-p printer-name |
独自のプリンタインタフェースプログラムを使用するプリンタ名 |
-i custom-interface |
独自のプリンタインタフェースプログラム名 |
独自のプリンタインタフェースプログラムが LP 印刷サービスに登録され、ユーザーが印刷要求を出すと、そのプリンタに使用されます。
独自のプリンタインタフェースプログラムが /etc/lp/printers/printer-name/configuration ファイルに追加されたかどうかを確認します。
次の例では、プリンタ luna の独自のプリンタインタフェースプログラム custom を設定します。
# lpadmin -p luna -i custom
次の例では、システム venus がプリンタ asteroid 上で使用中の独自のプリンタインタフェースプログラムを設定します。
# lpadmin -p asteroid -e venus