プリンター・インターフェース・スクリプトの作成

terminfo データベースへのエントリーの追加によってサポートされないプリンターを使用している場合、または印刷要件が standard インターフェース・スクリプトや、/etc/lp/model ファイルに提供されているその他のインターフェース・スクリプトによってサポートされない場合は、ユーザー独自のプリンター・インターフェース・スクリプトを作成できます。

カスタマイズしたインターフェース・スクリプトを作成するには、次の手順で行います。

  1. standard インターフェース・スクリプト (または /etc/lp/model 内にあるその他のスクリプトの 1 つ) を変更します。例:
    	
    	cd /etc/lp/model
    	
    	cp standard okidatanew
    	
  2. カスタム・インターフェース・スクリプトが、正しい stty モード (ボー・レートや出力オプションなどの端末特性) を設定していることを確認します。次の行から始まるセクションを調べてください。
      ## Initialize the printer port
  3. standard インターフェース・スクリプト内のコードを変更します。このスクリプトは、次のような行を使用して、印刷サービスまたはユーザーによって指定されるデフォルト・モードと調整済みモードを設定します。
    stty mode options 0<&1

    このコマンド・ラインは、stty コマンドの標準入力をプリンター・ポートから取得します。例えば、次の stty コマンド例は、ボー・レートを 1200bps に設定し、いくつかのオプション・モードを設定します。

    stty -parenb -parodd 1200 cs8 cread clocal ixon 0<&1
  4. プリンター・ポートのハードウェア・フロー制御特性を設定します。standard インターフェース・スクリプトはハードウェア・フロー制御を設定しません。これはご使用のコンピューター・ハードウェアに応じて設定されます。standard インターフェース・スクリプトのコードに、この特性とその他のプリンター・ポート特性を設定する場所が示されています。次の行から始まるセクションを調べてください。
      # Here you may want to add other port initialization code.
  5. プリンターによって列数が異なるため、インターフェース・スクリプトのヘッダーとトレーラーがご使用のプリンターに対応していることを確認してください。 standard インターフェース・スクリプトは、80 列のページに収まるバナーを印刷します (例外として、ユーザーのタイトルはこれより長くすることができます)。standard インターフェース・スクリプトのコード内で、次の行から始まるセクションを調べてください。
      ## Print the banner page
  6. 一部のアプリケーションを特定のプリンターと組み合わせて実行する場合に、改ページをオフにする必要が生じることがあります。改ページをオフにする必要がある場合は、次の行で標準インターフェース・プログラム (/usr/lib/lp/model/standard) を変更できます。
      if [ -n "${FF}" -a "no" = "${nofilebreak}" ]

    改ページをオフにするには、noyes に変更します。

  7. ユーザー関連のエラー・メッセージをすべて標準出力または標準エラー出力に書き込むように、カスタム・インターフェース・スクリプトに指定します。印刷サービスは、標準出力エラーをページに印刷し、標準エラーをユーザーにメールで送信します。
  8. 印刷が完了したときに、印刷ジョブの状況を示すコードを出して終了するように、インターフェース・スクリプトに指定します。終了コード表 (印刷サービスの終了コード) は、印刷サービスが終了コードを解釈する方法の説明です。
プリンターの障害について管理者にアラートを出す方法の 1 つは、コード 129 を出して終了することです。ただし、インターフェース・スクリプトが終了すると、印刷サービスは障害が解消した後で印刷ジョブを最初から再印刷します。 ジョブ全体を再印刷せずに管理者にアラートを出すようにするには、インターフェース・スクリプトが印刷サービスに障害メッセージを送信して、障害が解消するまで待つよう指定します。障害が解消すると、インターフェース・スクリプトはジョブの印刷を再開します。ジョブの印刷が完了すると、インターフェース・スクリプトは障害が発生しなかった場合と同様にゼロを戻して終了します。もう 1 つの利点として、障害が解消したことをインターフェース・スクリプトが自動的に検出できるので、管理者はプリンターを再び使用可能に設定しなくて済みます。

障害メッセージを印刷サービスに送信するように指定するには、lp.tell コマンドを使用します。 standard プリンター・インターフェース・コードは、LPTELL シェル変数を指定して lp.tell コマンドを呼び出します。lp.tell プログラムは、標準入力を印刷サービスに送信します。印刷サービスは、メッセージをアラートとして管理者に転送します。標準入力が空の場合、lp.tell はアラートを開始しません。lp.tell (LPTELL) プログラムの使用法の例については、standard インターフェース・スクリプト内で次のコメントの直後にあるコードを検討してください。

# Here's where we set up the $LPTELL program to capture
        # fault messages.
        #
        # Here's where we print the file.

特殊終了コード 129 または lp.tell の場合、インターフェース・スクリプト自体がプリンターを使用不可に設定する必要はありません。インターフェース・スクリプトがプリンターを直接使用不可に設定することはできますが、このようにすると障害アラート・メカニズムが指定変更されます。アラートは、プリンターに障害が発生したことを印刷サービスが検出した場合のみ送信され、その主な検出手段は特殊終了コードと lp.tell プログラムです。

印刷サービスがファイルの印刷をいずれかの時点で中断する必要がある場合は、シグナル 15 を使用してインターフェース・スクリプトを強制終了します (詳しくは、signal コマンドと kill コマンドを参照)。

他のいずれかのシグナルを受信した時点でインターフェース・スクリプトが停止した場合、印刷サービスは、以降の印刷ジョブは影響を受けないと想定し、プリンターの使用を継続します。印刷サービスは、ジョブが正常に終了しなかったことを印刷ジョブの送信者に通知します。

シグナル SIGHUPSIGINTSIGQUI、および SIGPIP (トラップ番号 1、2、3、および 13) は、インターフェースの呼び出し時には無視されます。standard インターフェース・スクリプトはこの動作を変更して、適切な時点でこれらのシグナルを捕捉し、これらのシグナルがプリンターに問題があることを意味していると解釈して、障害を発行するようにします。