Q2.機械は正常だと思います。使用法も間違っていないと思います。でも、 やっぱり printer から正常に印字されません。なにをすれば良いのですか

本題に入る前に、Unix での printing 処理について簡単に振れておきます。

Unix では、一般的に lpd という printing system が採用されています。こ の中では、印刷の命令は次のような流れで処理されていきます。

  1. lpr で出力された内容を lpd(Line Printer Daemon) が受信
  2. lpd は /etc/printcap の指示にしたがって、様々な処理を実施
  3. lpd は処理結果を printer の接続されている Port に対して送信
  4. Port に接続されている printer は送信されてきたデータをもとに印刷 処理開始
  5. 印刷終了
印刷が正常に終了しないということは、この上の処理の流れがどこかで滞って いるということです。言い替えれば、処理の停滞が起きた場所を把握して問題 を解消すれば、正常に printing される、ということです。

さて、この処理は 3 つの段階に分離することができます。それぞれの段階の keywords を列挙すると以下のようになります。

  1. Port。なお、 network printer にかんしてはQ3.Unix で network printer が使えませ んで議論を行ないます。
  2. lpd
  3. printcap
の 3 つです。この 3 つの内のどれに問題があって印刷処理が行なわれないの か?、ということを順に調べていきましょう。既に原因が判明している場合は、 以下にあげる段階別の対処を直接しらべてみてください。判明しない場合は、 順番に調べていきましょう。
  1. A2_1.Printer と port は正 しく設定されていますか
  2. A2_2./etc/printcap を正し く設定しましょう。
    1. A2_2_1.ちょっと癖のある、 printcap 特有の「お約束」について
    2. A2_2_2.Postscript printer を使 用する場合の設定について
    3. A2_2_3.ESC/P Printer で text を出力する場合の設定について
    4. A2_2_4.その他もろもろの話につ いて
  3. A2_3.lpd(ぷりんとだえもん 君)を起こしてあげましょう
  4. A2_4.Printer の期待してい るデータを Printer 君に食べさせてあげましょう。
    1. A2_4_1.ページ記述 言語(PDL:Page Descriptive Language)ってなんですか?
    2. A2_4_2.PDL の format
なお、lpr ,printcap については必要があることは、後ろの方で記述していき ます。ただ、より詳しいことが知りたい場合は、lpr ,printcap などの man を御参照下さい。


A2_1."Printer と port は正しく設定されていますか?"って何?

Unix では、kernel とよばれる OS 本体の program があります。計算機では、 様々なデバイスを通して入力されたデータや命令をもとに計算を行ない、それ を画面デバイスなどの出力デバイスに出力する、という処理を行なっています。 kernel は Unix で、その中心的な役割を果す program です。この関係は以下 のようにまとめることができます。

A2_1_1.Unix での device と処理の流れ

Input device(HDD とか keyboard とか色々)

input port(SCSI Interface とか PS/2 port とか色々)

input device file

kernel

output device file(*)

output port (paralell port とか serial port とか SCSI Interface とか)

output device (Printer とか HDD とか)
なお、ここでは device file 等の本質的なことに関しては議論をしません。 詳細は man page などを引いてください。

印刷処理を行なう時に問題になるのは、上の関係の (*) 以下の output device file です。Printer に良く使用される device を OS ごとにまとめて みると、以下のようになります。
表:OS と printer に良く用いられる device file
OSdevice fileport 種別
FreeBSD-3.x/dev/nlpt0(/dev/ppi0?)parallel port
FreeBSD-2.x/dev/lpt0parallel port
FreeBSD-1.x/dev/lpa0parallel port
SunOS-4.1.4(SparcStation1+)/dev/ttydbserial port
DEC/OSF-1/dev/lp0parallel port(多分)
lpt0,lpt1 というようにいくつかの device があるときは、lpt0 だけを代表 的に記述しています.また SS1+ 上で運用されている SunOS の場合は、 コネクタを /dev/ttyda 用にすれば /dev/ttyda でも大丈夫でしょう。

serial port の場合 Parallel port の場合と違って、Baud rate/Stop bit/Parity などいくつかの項目を設定する必要があります。これについては、 printer の manual で通信条件などを,OS の man page などで device や printcap の書き方についてを調べた上で記述してください。ここでは、詳述 しません。
できません、というのがより正確 ;-)

A2_1_2. output device file の状態・設定の確認

まず、printer を接続している port が正しく動作をしているかを確認してみ ましょう。

  1. device 用の driver は、install されていますか?
    実際の hardware device を操作するための program を、device driver と呼びます。一般的な hardware なら、driver は存在していま す。しかし、あまり一般的ではない、あるいは新しく開発されたものな どには、device driver が存在していない場合があります。
    このような際は、既に device driver が開発されている、別の port を使うようにしてください。
  2. device は kernel から認識されていますか?
    kernel が出力結果を output 用の device file に送るためには、なに にも先じて kernel が output device の存在を認識している必要があ ります。
    boot 時に、kernel は接続されている device を probe/attach してい きます。この際に、printer が接続されている port が認識されている ことを確認しましょう。
    たとえば、FreeBSD(98)-2.2.6R の場合、device が認識されてい ると、次のようになります。
          sakura: {6} dmesg |grep lpt
          lpt0 at 0x40-0x47 on isa
          
    dmesg は,kernel message を表示する命令です。一般的には boot 時に、 だだ〜っ、と表示される内容が格納されています。この結果をパイプに 出力して、その結果を grep lpt とし、lpt という文字列が含まれる行 だけを抽出しています。この lpt の部分は、先の表に従って、御自分 の環境に適したものにしてください。
    1. A2_2_1.ちょっと癖のある、 printcap 特有の「お約束」について
    2. A2_2_2.Postscript printer を使 用する場合の設定について
    3. A2_2_3.ESC/P Printer で text を出力する場合の設定について
    4. A2_2_4.その他もろもろの話につ いて
    もし、正常に認識されている場合は、上に示したような結果になるはず です。

    なお、もし認識されていなかったら次の対処を行なってください。

    1. BIOS の設定などを確認する。もし port が disable されていた ら、これを enable にする。
    2. boot 時、kernel が期待する hardware の設定と、BIOS の実際 の設定を一致していなかったら、これを一致させる。
      環境によっては、kernel の再構築をしてあげる必要があるかも しれません。
    このあたりは、Q&A,handbook などを参考にしてく ださい。
  3. device file は作成されていますか?
    device file は、kernel が boot 時 probe/attach した device に対 して、access する際に使用される file です。仮に、device 自体が認 識されていたとしても、この入出力に用いられる device file が無い と、機械に入出力すべきデータのやりとりが出来ないことになります。
    勿論 printer port 用の device file も必要になります。この file が正しく存在していることを確認してあげましょう。

    FreeBSD(98)-2.2.6R の場合、device file が正常に存在していると以 下のようになります。

          sakura: {7} ls -la /dev/lpt0
          crw-------   1 root     wheel     16,   0 May 10 22:53 /dev/lpt0
          

    この file がなかった場合は、次のようにしてこの file を作成してあ げてください。FreeBSD の場合以下のようになります。

    1. root になる
    2. cd /dev;./MAKEDEV lpt0
    なお、環境によってはこの手順は代わるかもしれません。device file の作成についての詳細は、別の文献等で御調べ下さい。
  4. device file の permission は正しいですか?
    device file にも permission があります。いずれの user にも read/write が出来ないように permission が設定されていると、 device への read/write access も出来なくなります。
    MAKEDEV を使って device file を make すると、上のような permission と owner が設定されます。ですので、通常この permission と owner が問題になることはありません。
    ただ、万が一このような設定になっていない場合は次のようにして、変 更しておきましょう。
    1. root になる
    2. cd /dev
    3. chmod 600 lpt0
    4. chown root.wheel lpt0

A2_1_3.device の動作の確認

以上の確認をして問題がなければ、printer port は device として正常に動 作しているはずです。実際の動作をしていることを確認してみましょう。確認 方法には、以下にあげるような手段が考えられます。
  1. lpr hoge.txt などを入力してみる。
    これで思った通りの印刷が行なわれれば、"printer port の設定がまずかったね。これで一件落着。めでたしめでたし。チャンチャ ン" ということになります :-)
  2. device file に直接データを送ってみる。
    device file に直接データを送ってみて、printer にデータが渡された かを確認してみましょう。もし,printer の device file が /dev/lpt0 だとすると、以下のような方法で行ないます。なお、permission の関 係から、多分以下の作業は root で行なう必要があります。
          cat hoge.txt >>/dev/lpt0
          
この結果 などの現象が起きれば、printer port の "hardware としての動作" と "設定 " は一応問題なく終わっていると考えられます。

ここまでで、まだ printer が意図した通りの動作をしてくれない場合は他の 設定の個所に問題がある、ということになります。次のA2_2./etc/printcap を正し く設定しましょ う、またはA2_3.lpd(ぷりんとだえも ん 君)を起こしてあげましょうなどを御参照下さい。


A2_2./etc/printcap を正しく設定しましょう。

printcap は、lpd (ぷりんとだえもん)の動作を決定する file です。 "printer が思い通りの印刷をしてくれない" 時、ほとんどの場合、原因はこ の file の設定の仕方に問題があります。したがって、ここを修正さえすれば、 大抵の場合印刷が可能になるわけです。

ということで、「よし printcap を正しく設定しよう。」ということになりま す。そして、大抵の方は次に「じゃあ、お手本ちょうだい」ということになる でしょう。ここで、 printcap 特有の困った問題が起きてしまいます。

printcap の設定は printer に大きく依存する部分(それも重要な部分)が沢 山ある
のです。つまり、「これで万事 OK」というような printcap は存在しない、 といっても言い過ぎではないのです。

ここでは、このような printcap の特徴を踏まえて、次のような章立てでまと めていきます。

  1. A2_2_1.ちょっと癖のある、 printcap 特有の「お約束」について
  2. A2_2_2.Postscript printer を使 用する場合の設定について
  3. A2_2_3.ESC/P Printer で text を出力する場合の設定について
  4. A2_2_4.その他もろもろの話につ いて

A2_2_1.ちょっと癖のある、printcap 特有の「お約束」について

printcap を記述する際には、いくつかの「お約束」があります。有名なもの とその対処について列挙していきます。あなたの printcap は「大丈夫」です か?

printcap で設定する必要のある事

printcap では、次の事項を最低限設定する必要があります。
printer 名
ここで、lp を指定すると default printer として扱われるようになり ます。
lp
printer の接続されている port の device file。lpt0 などが該当し ます。上記のように、きちんと接続されていることを調べた port を記 述していることを確認しておいてください。
sd
spool directory.印刷を指示された data を一時的に保管するための directory です。printer 毎に違うものにする必要があります。
とりあえず、最低限以上のことだけは設定しましょう。

printcap の癖

この章では、ちょっと不味い(=お約束を破っている) printcap について不味 い個所の検討と、その対策についてを説明していきます。
行の最後に '\' をつけていますか?
これをつけていないと、printcap の entry は、その行で終了したこと になります。この場合、この下の行に、一生懸命重要な設定をしたとし ても無視されてしまうことになります。
printer 名のところの記述はあっていますか?
printer 名は、
lp|local line printer:\
というように、 必要があります。また、一般的にこの行は prniter 名だけを定義して 改行するのが一般的です。この場合、最後に '\' が付加することを忘 れないようにしましょう。
printer 名、以外の行頭は、'#' または ':' になっていますか?
'#' はコメント。':' は上記行からの継続であることを意味します。も し、いずれも付加しないと、あらたな printer 名が始まったとして認 識されてしまいます。
spool directory は、printer 毎に代わっていますか?
spool directory は、printer の設定毎に変えるようにしましょう。 FreeBSD では、これが重複していると lpd が起動しません。これは、 後述A2_3.lpd(ぷりんとだえも ん 君)を起こしてあげましょう等を御参考下さい。
なお、SunOS4.* とかでは、ここを重複させても lpd は起動しますが、 あまり嬉しくない事態が発生する危険性があったように記憶しています。
とりあえず、これらの設定に問題が無いかを check してみましょう。
この時、前後の行とかにも問題が無いことを check しておきましょう。該当 部分は正しいにもかかわらず、前後の部分が間違っているために、誤動作が止 まわないときもあります。
このようにならないようにするためにも、printcap は、不要な行を削除し ておいて短めにするのが、問題を速く解決するためのコツです。

printcap のコツ

また、printcap の問題ではないのですが、printcap で設定しておくと便利な 設定に,次のものがあります。
mx#0 を追加する
printcap を解釈するのは lpd という program(一般に printer daemon と呼ばれます)です。default 設定では、この program が印刷時に受け つける data の size は、1024kB(=1,024×1,024Bytes。漢字の文字数 にして、大体 100,000 字) となっています。
このような制限が設けられて当時は、これで問題が無かったのでしょう。 しかし、現在、文字だけでなく画像データなども頻繁に印刷するように なってきています。そして、この制限は非常に厳しいものとなっていま す。
mx#(数値)
の数値の部分を大きくすれば良いのですが、この設定値以上のサイズを 持つデータを印刷しようとすると結局同様の問題が生じてしまいます。
ここは、数値のところに 0 を入れて
mx#0
として、"無制限" とすると、楽です。

もちろん、site の policy として、制限をかける必要がある場合は、 この限りではありません。
また、この無制限ということは、決して極端に大きな size の file 印 刷をいくらでもしても良い、という意味ではありません。限られた計算 機資源は、たくさんの user が平等に有効な利用が出来るようにするの は、user の最低限のエチケットの一つです。

不要な行が沢山含まれていませんか?
コメント行とかが沢山あると、問題のある部分が見付けだし難くなりま す。出来る限り、簡略なものにするようにしましょう。

A2_2_2.Postscript printer を使用する場合の設定について

Postscript Printer を使用する場合は、以上に書いてあるように設定してお けば、大体問題が無いようになります。また、Postscript は Unix での printer 出力は de facto standard です。だから、application の出力につ いても悩む必要も、ほとんどありません。

ただ、Postscript Printer は、直接 text 文字列を送信しても印字は 100% してくれません。Postscript は "これこれを書いてね" ということを記述し ているデータで、printer はこのような言語を期待しています。ところが、 text file をそのまま送られてしまっても、printer から見れば「これこれを 出力してね」という肝心の命令が無いことになります。そのため printer が 何を出力したら良いのか分からなくなってしまうのです。
「めし」「おちゃ」「ふろ」「ねる」だけでは、printer 君 は動いてくれないわけですね :-)

なお、このようなことを記述している言語を一般に Printer Descriptive Language(=PDL)と呼びます。これについては.A2_4_1.ページ記述言語(PDL:Page Descriptive Language)ってなんですか?でふれます。

この問題を解決する方法は次の 2 点が考えられます。

  1. user の教育を徹底して、text data を印刷するときは、a2ps などの ASCII data を Postscript data に加工する program を通してもらう ようにする。
    → user 教育の手間が解消出来ないという問題点があります。ただ、 unix では、一般的に "printer に出力データを送る = Postscript data を printer に送る" となっています。したがって、text data 以 外では、それ程手間はかからないでしょう。
    なお、a2ps は IIJ のうたしろさんが記述された perl script です。 IIJ の ftp siteで取得すること が可能です。
  2. if に ASCII data → Postscript data にするような program(a2psな ど)を設定する。
    → text data 以外の data が直接入力されたりする or Postscript file が text data として認識されてしまう、などの現象が起きたとき、 予想外の動作をしてしまう危険性があります。
    これは、file の magic number などを用いて対処することが可能でしょ う。
    なお、このような動作をしてくれる soft に a2ps という soft があり ます。これは上で紹介した IIJ のうたしろさんによるものとは別の program です。こちらは、日本語に対応していません ;-)

ueta@pixy.issp.u-tokyo.ac.jp
Last modified: Mon Jun 14 22:46:05 JST 1999