この章では、LP 印刷サービスの内容説明を提供します。
印刷管理作業の手順については、次の章を参照してください。
「LP 印刷サービス」とは、ユーザーが作業を続けながらファイルを印刷できるようにするソフトウェアユーティリティの集合です。当初、印刷サービスは LP スプーラと呼ばれていました (LP はラインプリンタを意味しますが、現在ではレーザプリンタなど、他の多数のプリンタも含まれています。スプール (spool) は、system peripheral operation off-line の頭文字です)。
印刷サービスは、LP 印刷サービスソフトウェア、システム管理者が提供する印刷フィルタ、ハードウェア (プリンタ、システム、およびネットワーク接続) からなっています。
この節では、LP 印刷サービスのディレクトリ構造、ファイル、ログ、およびコマンドについて説明します。
LP 印刷サービスのファイルは、表 45-1 のように 7 つのディレクトリに分散されています。
表 45-1 LP 印刷サービスのディレクトリ
ディレクトリ |
内容 |
---|---|
/usr/bin |
LP 印刷サービスのユーザーコマンド |
/etc/lp |
LP 構成ファイルの階層 |
/usr/share/lib |
terminfo データベースディレクトリ |
/usr/sbin |
LP 印刷サービスの管理コマンド |
/usr/lib/lp |
LP デーモン。バイナリファイルと PostScript フィルタのディレクトリ。model ディレクトリ (標準プリンタインタフェースプログラムが入っている) |
/var/lp/logs |
LP 動作のログ: lpsched.n - lpsched からのメッセージ。 requests.n - 完了した印刷要求に関する情報 |
/var/spool/lp |
ファイルが印刷待ち行列に入れられるスプーリングディレクトリ |
スケジューラは、表 45-2 のように、/etc/lp ディレクトリに入っている LP 構成ファイルに構成情報を格納します。
表 45-2 の構成ファイルはプライベートインタフェースで、将来のリリースでは変更される可能性があります。現在の場所にあるファイルに依存する、または現在使用している形式のデータに依存するソフトウェアを構築しないようにしてください。
ファイル |
タイプ |
説明 |
---|---|---|
classes |
ディレクトリ |
lpadmin -c コマンドで与えたクラスを識別するファイル |
fd |
ディレクトリ |
既存のフィルタの記述 |
filter.table |
ファイル |
印刷フィルタ照合テーブル |
forms |
ディレクトリ |
各フォームのファイルを格納する場所。最初は、このディレクトリは空になっている |
interfaces |
ディレクトリ |
プリンタインタフェースプログラムファイル |
logs |
/var/lp/logs へのリンク |
印刷動作のログファイル |
model |
/usr/lib/lp/model へのリンク |
標準プリンタインタフェースプログラム |
printers |
ディレクトリ |
各ローカルプリンタのディレクトリ。各ディレクトリには、個々のプリンタの構成情報と警告ファイルが入っている |
pwheels |
ディレクトリ |
印字ホイールまたはカートリッジファイル |
これらの構成ファイルは、SunOS 4.1 の /etc/printcap ファイルに似た機能を提供します。
これらのファイルの内容を確認できますが、直接編集しないでください。代わりに、lpadmin(1M) コマンドを使用して構成を変更します。変更内容は /etc/lp ディレクトリ内の構成ファイルに入力されます。lpsched デーモンは、構成ファイルを管理して構成します。
/etc/lp/printers ディレクトリには、システムに認識されるプリンタ (ローカルまたはリモート) ごとに 1 つずつサブディレクトリが入っています。次の例は、プリンタ sparc1 と luna の /etc/lp/printers サブディレクトリを示します。
$ ls -l /etc/lp/printers drwxrwxr-x 2 lp lp 512 Jan 23 23:53 luna drwxrwxr-x 2 lp lp 512 Jan 11 17:50 sparc1
プリンタ固有の各ディレクトリ内では、次のファイルを使用してプリンタを記述できます。
alert.sh - 警告に応答して実行するシェル
alert.vars - 警告変数
configuration - 構成ファイル
users.deny - プリンタアクセスが拒否されるユーザーのリスト
comment - プリンタ記述
通常、プリンタ luna の構成ファイル /etc/lp/printers/luna/configuration は、次のようになっています。
Banner: on: Always Content types: PS Device: /dev/term/b Interface: /usr/lib/lp/model/standard Printer type: PS Modules: default
/usr/share/lib ディレクトリには、terminfo データベースのディレクトリが入っており、そのディレクトリには多数のタイプの端末とプリンタに関する定義が入っています。LP 印刷サービスは、terminfo データベース内の情報を使用してプリンタを初期設定し、選択されたページサイズ、文字ピッチ、行ピッチ、および文字セットを設定し、一連のコードをプリンタに送ります。
各プリンタは、terminfo データベース内で短縮名を使用して識別されます。terminfo データベースの構造については、「プリンタタイプ」を参照してください。必要であれば、terminfo データベースにエントリを追加できますが、これは煩雑で時間のかかる作業です。詳細は、「サポートされていないプリンタの terminfo エントリを追加する」 を参照してください。
/usr/lib/lp ディレクトリには、表 45-3 のように LP 印刷サービスに使用されるデーモンとファイルが入っています。
表 45-3 /usr/lib/lp ディレクトリの内容
ファイル |
タイプ |
説明 |
---|---|---|
bin |
ディレクトリ |
印刷警告、低速フィルタ、待ち行列管理プログラムを生成するファイルが入っている |
lpsched |
デーモン |
LP 印刷要求のスケジューリングを管理する |
model |
ディレクトリ |
標準プリンタインタフェースプログラムが入っている |
postscript |
ディレクトリ |
SunOS 5.x の LP 印刷サービスから提供されるすべての PostScript フィルタプログラムが入っている。これらのフィルタには、フィルタの特性とその格納場所を LP 印刷サービスに指示する /etc/lp/fd ディレクトリ内の記述子ファイルが付いている |
LP 印刷サービスは、次の 2 組のログファイルを管理します。
/var/spool/lp - 印刷待ち行列に入っている現在の待ち行列のリスト
/var/lp/logs/requests - 進行中の印刷要求の履歴
各システムのスケジューラは、ディレクトリ /var/spool/lp/tmp/system と /var/spool/lp/requests/system 内で印刷要求のログを保管します。各印刷要求には、(ディレクトリごとに 1 つずつ) 情報が入った 2 つのファイルがあります。/var/spool/lp/requests/system ディレクトリ内の情報には、スーパーユーザーまたは lp しかアクセスできません。/var/spool/lp/tmp/system 内の情報には、その要求を出したユーザー、スーパーユーザー、または lp しかアクセスできません。
次の例は、/var/spool/lp/tmp/terra ディレクトリの内容を示しています。
$ ls /var/spool/lp/tmp/terra 20-0 21-0 terra$ cat 21-0 C 1 D slw2 F /etc/default/login P 20 t simple U tamiro s 0x1000
これらのファイルは、印刷要求が待ち行列に入っている限り、そのディレクトリ内に残っています。要求が完了すると、ファイル内の情報は組み合わされ、ファイル /var/lp/logs/requests に追加されます。このファイルについては、次の節で説明します。
現在待ち行列に入っている印刷要求の状態を追跡したい場合は、/var/spool/lp logs ログ内の情報を使用します。
LP 印刷サービスは、lpsched と requests という 2 つのログファイルに印刷サービスの履歴を記録します。これらのログファイルは、/var/lp/logs ディレクトリに入っています。これらのログ内の情報を使用し、印刷の問題を診断して解決できます。次の例は、/var/lp/logs ディレクトリの内容を示します。
# cd /var/lp/logs # ls lpsched.1 requests requests.2 lpsched lpsched.2 requests.1 #
接尾辞 .1 と .2 が付いているファイルは、前日のログのコピーです。毎日、lp cron ジョブは lpsched ログファイルと requests ログファイルを消去して、2 日分のコピーを保管します。requests ログを消去する cron ジョブを変更するためのヒントについては、「crontab ファイルの作成と編集」を参照してください。
問題の解決に最も重要なのは、ローカル印刷要求に関する情報が入っている lpsched ログです。
requests ログには、完了して印刷待ち行列から消去された印刷要求に関する情報が入っています。印刷要求が終了すると、/var/spool/lp ログファイル内の情報が組み合わされ、/var/lp/logs/requests ログに追加されます。
requests ログの構造は単純なので、共通の UNIX シェルコマンドを使用してデータを抽出できます。要求は、出力された順番に要求 ID を示す行で区切って表示されます。区切り行の下の各行には、その行に入っている情報の種類を識別する 1 文字が付いています。各文字は、空白文字 1 つでデータから区切られます。
次の例は、requests ログの内容を示しています。
# pwd /var/lp/logs # tail requests.2 = slw2-20, uid 200, gid 200, size 5123, Tue Jun 17 10:16:10 MDT 1997 z slw2 C 1 D slw2 F /etc/motd P 20 t simple U irving s 0x0100 #
表 45-4 は、文字コードとそれに対応する LP requests ログ内の行を示しています。
表 45-4 LP requests ログ内の文字コード
文字 |
行の内容 |
---|---|
= |
区切り行。ユーザーの要求 ID、ユーザー ID (UID)、グループ ID (GID)、元の (フィルタを通す前の) ファイルサイズ、および要求が待ち行列に入れられた時刻が入っている |
C |
印刷部数 |
D |
出力先のプリンタかクラス、または any |
F |
印刷されたファイル名。この行は印刷されたファイルごとに区切られ、各ファイルは表示された順序で印刷される |
f |
使用されたフォーム名 |
H |
特殊処理 resume、hold、または immediate |
N |
印刷要求が正常に完了したときに使用された警告のタイプ。ユーザーが電子メールで通知を受けた場合は M タイプ、端末へのメッセージで通知を受けた場合は W タイプ |
O |
プリンタ依存の -o オプション (nobanner など) |
P |
印刷要求の優先順位 |
p |
印刷されたページのリスト |
r |
ユーザーがファイルの「raw」処理を要求した場合 (lp コマンドの -r オプション) に含まれる 1 文字の行 |
S |
使用された文字セット、印字ホイール、またはカートリッジ |
s |
16 進数形式の各ビットの組み合わせで表される要求の結果。印刷サービスの内部では複数のビットが使用される。各ビットとその意味については表 45-5 を参照 |
T |
バナーページに印刷されるタイトル |
t |
ファイル内で見つかった内容形式 |
U |
印刷要求を出したユーザー名 |
x |
印刷要求に使用された低速フィルタ |
Y |
要求の印刷に使用された印刷フィルタの特殊モードのリスト |
z |
要求に使用されたプリンタ。要求がプリンタまたはプリンタクラスの待ち行列に入れられた場合や、要求が別の出力先に移動された場合は、このプリンタは出力先 (D 行) とは異なる |
表 45-5 は、LP requests ログ内の結果コードとその説明です。
表 45-5 LP requests ログ内の結果コード
結果コード |
説明 |
---|---|
0x0001 |
要求は保留され再開を待機中 |
0x0002 |
低速フィルタを実行中 |
0x0004 |
低速フィルタを正常に完了 |
0x0008 |
要求はプリンタ上にある |
0x0010 |
印刷を正常に完了 |
0x0020 |
要求は保留されユーザーによる変更を待機中 |
0x0040 |
要求は取り消し済み |
0x0080 |
要求は次に印刷される |
0x0100 |
フィルタ処理または印刷要求に失敗 |
0x0200 |
要求はリモートプリンタに転送中 (現在は使用されない) |
0x0400 |
ユーザーに通知 |
0x0800 |
通知が動作中 |
0x1000 |
リモートシステムが要求を受け付け済み (現在は使用されない) |
0x2000 |
管理者が要求を保留した |
0x4000 |
プリンタのフィルタを変更しなければならなかった |
0x8000 |
要求は一時的に停止された |
印刷待ち行列に入れられたファイルは、印刷されるまで /var/spool/lp ディレクトリに格納されますが、それがわずか数秒の場合があります。表 45-6 は、/var/spool/lp ディレクトリの内容を示します。
表 45-6 /var/spool/lp ディレクトリの内容
ファイル |
タイプ |
説明 |
---|---|---|
SCHEDLOCK |
ファイル |
スケジューラのロックファイル。スケジューラが停止し、再起動されない場合は、このファイルをチェックする |
admins |
ディレクトリ |
/etc/lp へのリンク |
bin |
ディレクトリ |
/usr/lib/lp/bin へのリンク |
logs |
リンク |
完了した印刷要求のログが記録される ../lp/logs へのリンク |
model |
リンク |
/usr/lib/lp/model へのリンク |
requests |
ディレクトリ |
印刷要求が印刷されるまで記録される構成済みプリンタごとのサブディレクトリが入ったディレクトリ。ユーザーはこのログにアクセスできない |
system |
ディレクトリ |
システムの印刷状態ファイル |
temp |
リンク |
スプールされた要求が入っている /var/spool/lp/tmp/hostname へのリンク |
tmp |
ディレクトリ |
印刷要求が印刷されるまでログが記録される構成済みの各プリンタのディレクトリ。既存の印刷要求を変更した場合も、このログに記録される |
表 45-7 は、頻繁に使用する LP 印刷サービスのコマンドを示します。1M コマンドを使用するには、スーパーユーザーまたは lp にならなければなりません。
表 45-7 LP 印刷サービスコマンド早見表
コマンド |
機能 |
---|---|
enable(1) |
プリンタを使用可能にする |
cancel(1) |
印刷要求を取り消す |
lp(1) |
1 つ以上のファイルをプリンタに送る |
lpstat(1) |
LP 印刷サービスの状態を出力する |
disable(1) |
1 台以上のプリンタを無効にする |
accept(1M) |
印刷要求を特定の出力先の待ち行列に入れられるようにする |
reject(1M) |
印刷要求が特定の出力先の待ち行列に入れられないようにする |
lpadmin(1M) |
プリンタの構成を設定または変更する |
lpfilter(1M) |
フィルタの定義を設定または変更する |
lpforms(1M) |
あらかじめ印刷されたフォームを設定または変更する |
lpadmin(1M) |
フォームを取り付ける |
lpmove(1M) |
ある出力先から別の出力先に出力要求を移動する |
lpsched(1M) |
LP 印刷サービススケジューラを起動する |
lpshut(1M) |
LP 印刷サービススケジューラを停止する |
lpusers(1M) |
デフォルトの優先順位と、LP 印刷サービスのユーザーが要求できる優先順位の制限を設定または変更する |
LP 印刷サービスは、次の機能を実行します。
ファイルを管理してローカル印刷要求をスケジュールする。
ネットワーク要求を受け取り、スケジュールする。
ファイルが正しく印刷されるように必要に応じてフィルタを通す。
プリンタとインタフェースするプログラムを起動する。
ジョブの状態を追跡する。
プリンタに取り付けられたフォームを追跡する。
現在装着されている印字ホイールを追跡する。
新しいフォームや別の印字ホイールを取り付け、装着するよう警告を発する。
印刷問題に関する警告を発する。
ディレクトリ構造とコマンドについては、「LP 印刷サービスの構造」を参照してください。
LP 印刷サービスには、lpsched というスケジューラデーモンが組み込まれています。スケジューラデーモンは、プリンタの設定と構成に関する情報を使用して LP システムファイルを更新します。
また、lpsched デーモンは、ユーザーが要求をアプリケーションから出すかコマンド行から出すかに関係なく、図 45-1 のように、印刷サーバー上のすべてのローカル印刷要求をスケジュールします。さらに、スケジューラはプリンタとフィルタの状態を追跡します。プリンタが要求を印刷し終わると、印刷サーバー上の待ち行列に残っているものがあれば、スケジューラは次の要求をスケジュールします。
各印刷サーバーは、LP スケジューラを 1 つだけ実行していなければなりません。スケジューラは、システムのブート時に (または実行レベル 2 を入力すると)、制御スクリプト /etc/rc2.d/S80lp によって起動されます。システムを再起動しなくても、/usr/lib/lp/lpshut コマンドを使用してスケジューラを停止し、lpsched コマンドを使用して再起動できます。各システムのスケジューラは、lp コマンドによってシステムに出された要求を管理します。
各印刷クライアントは、ネットワーク経由で直接、印刷サーバーと通信します。通信は、要求コマンド (lp、lpstat、cancel、lpr、lpq、または lprm) と印刷サーバー上の印刷サービス間で行われます。これによって、クライアント専用システムにおける印刷システムのオーバーヘッドが軽減され、その結果、拡張性、性能、およびデータの正確性が向上します。
印刷サーバーは、現在、インターネットサービスデーモン (inetd) で印刷要求を待機します。ネットワークから印刷サービスへ要求があると、inetd は「プロトコルアダプタ」と呼ばれるプログラム (in.lpd) を起動します。プロトコルアダプタは、印刷要求を翻訳して、印刷スプーラに送信し、その結果を要求依頼元に戻します。プロトコルアダプタは要求の発生時に起動して、ネットワーク要求の処理が完了すると終了します。これによって、印刷のためのアイドル状態のシステムのオーバーヘッドが解消されます。また、Solaris の以前の印刷機能にあった、ネットワークに接続された印刷サポート用の余分なシステム構成が不要になります。
印刷フィルタは、待ち行列内のファイルの内容をある形式から別の形式に変換する印刷サーバー上のプログラムです。
印刷フィルタは、必要に応じて単純なものでも複雑なものでもかまいません。SunOS 5.x システムソフトウェアの場合は、出力先プリンタが PostScript 形式へのデータ変換を必要とするほとんどの PostScript 印刷状況に対応する印刷フィルタが、/usr/lib/lp/postscript ディレクトリに組み込まれています。PostScript 以外のプリンタ用のフィルタが必要な場合は、そのフィルタを作成し、目的のシステムに追加しなければなりません。
一連の「印刷フィルタ記述子ファイル」が /etc/lp/fd ディレクトリに用意されています。これらの記述子ファイルは、フィルタの特性 (高速フィルタや低速フィルタなど) を記述し、フィルタプログラム (/usr/lib/lp/postscript/postdaisy など) を指します。
LP 印刷サービスは、オペレーティングシステムの他の部分と情報をやり取りします。また、標準プリンタインタフェースプログラムを使用して、次の作業を実行します。
必要に応じてプリンタポートを初期化する。標準プリンタインタフェースプログラムは、stty コマンドを使用してプリンタポートを初期化する。
プリンタを初期化する。標準プリンタインタフェースプログラムは、terminfo データベースと TERM シェル変数を使用して、適切な制御シーケンスを見つける。
必要に応じてバナーページを印刷する。
印刷要求で指定された部数だけ印刷する。
LP 印刷サービスは、別のプログラムが指定されなければ、標準インタフェースプログラム (/usr/lib/lp/model ディレクトリに入っています) を使用します。独自のインタフェースプログラムを作成することもできますが、独自のプログラムがプリンタへの接続を終了させないことや正しいプリンタの初期設定を妨げないことを確認しなければなりません。
印刷サーバー上と印刷クライアント上の lpsched デーモンは、処理する印刷要求ごとに 1 つずつログを保管し、印刷処理中に発生するエラーを記録します。このログは /var/lp/logs/lpsched ファイルに保管されます。毎晩、lp cron ジョブは /var/lp/logs/lpsched を新しい lpsched.n ファイル名に変更し、新しいログファイルを開始します。エラーが発生したり、印刷待ち行列からジョブが消えたりした場合は、ログファイルを使用して lpsched で実行された印刷ジョブへの処理を判別できます。
/var/lp/logs ディレクトリ内の lpsched および requests ログファイルは、情報が追加されるにつれて大きくなります。LP 印刷サービスは、デフォルトの cron ジョブを使用してログファイルを消去します。lp cron ジョブは /var/spool/cron/crontabs/lp ファイルに入っています。このジョブはログファイルの内容を定期的に移動します。ログの内容は log.1 に移動され、log.1 の内容は log.2 に移動されるというようになります。log.2 が上書きされると、その内容は失われます (つまり、log.1 の前の内容に置き換えられます)。
# pwd /var/lp/logs # tail requests s 0x1010 = slw2-20, uid 200, gid 200, size 5123, Mon Jun 16 12:27:33 MDT 1997 1992 z slw2 C 1 D slw2 F /etc/motd P 20 t simple U irving s 0x1010 #
Solaris 2.6 リリースより、プリンタサーバー上の requests ログファイルは、毎日ではなく、毎週交換されることになりました。プリンタサーバーの使用頻度が高い場合は、交換間隔を毎日に再設定できます。
プリンタサーバー上でスーパーユーザーまたは lp になります。
EDITOR 環境変数を設定します。
# EDITOR=vi # export EDITOR
lp の crontab ファイルを編集します。
# crontab -e lp
requests ログファイルの交換間隔を指定するファイルの先頭行を、毎日曜日 (0) から、毎日を示すアスタリスク (*) に変更します。
13 3 * * * cd /var/lp/logs; if [ -f requests ]; then if [ -f requests.1 ]; then /bin/mv requests.1 requests.2; fi; /usr/bin/cp requests requests.1; >requests; fi
ファイルを保存して、終了します。
図 45-2 は、ユーザーがローカルプリンタ上に PostScript ファイルを印刷する要求を出したときに実行される動作を示します。ローカルプリンタとは、ユーザーのシステムに接続されたプリンタです。すべての処理はローカルシステムによって実行されます。ただし、印刷要求は、クライアントとサーバーが異なるシステムにある場合と同じ経路をたどります。要求は常に同じ経路をたどって、クライアントからサーバーに流れていきます。
図 45-3 は、SunOS 5.x 印刷クライアント上のユーザーが SunOS 4.1 印刷サーバーに印刷要求を出したときに実行される処理を示しています。このコマンドは接続を開いて、印刷サーバーとの通信を直接処理します。
図 45-4 は、SunOS 5.6 印刷サーバーに印刷要求を出す SunOS 4.1 印刷クライアントを示しています。lpd デーモンは、印刷要求のローカル部分と印刷サーバーへの接続を処理します。印刷サーバー上のネットワーク待機プロセス inetd は、ネットワーク印刷要求を待って、プロトコルアダプタを起動して要求を処理します。プロトコルアダプタは lpsched デーモンと通信し、このデーモンが印刷サーバー上で要求を処理します。
図 45-5 は、SunOS 5.x 印刷クライアントのユーザーが SunOS 5.x の印刷サーバーに印刷要求を出したときに実行される処理を示しています。印刷クライアント上の印刷コマンドは、印刷サーバーと直接通信することによって、各印刷要求のローカル部分を処理します。
印刷サーバー上の inetd プロセスは、ネットワークからの印刷要求を監視し、プロトコルアダプタを起動して、印刷サーバー上の lpsched デーモンと通信します。このデーモンが印刷要求を処理します。