Topic 107 Printing筆記 Topic 107 Printing · 1.107.2 Manage printers and print queues Description: The candidate should be able to manage print queues and user print jobs. This objective includes monitoring print server and user print queues and troubleshooting general printing problems. Key files, terms, and utilities include: lpc 印表機控制 lpq 列印佇列顯示-l 詳細資料 -P印表機名 -a 所有列印佇列 lprm 列印佇列刪除 lpr 脫機列印 -C class A(lowest)-Z(highest ) lpr -C B test.txt -h 不顯示title -K -# -P printer -T title ================================================================= Linux下的列印工作   在Linux下採用周邊同作(spooling)列印方法,當用戶需要列印一個文件時,該文件並不直接送到印表機,而是送到spool目錄下,然後由一個負責列印的後臺進程把這些資料送入印表機。   Linux對每台印表機都定義了一個列印緩衝區,印表機守護程式經常掃描列印緩衝區以查看有無要列印的新文件。如果存在,就按先進先出的順序列印緩衝區中的文件。   Linux系統除了可以在本地印表機上列印外,還可以通過網路印表機遠端列印。   用於列印的命令   Linux系統提供了一組有關列印的命令。一般情況下,列印命令使用默認印表機;如果用戶定義了PRINTER環境變數,列印命令就使用這個變數定義的印表機;另外,用戶還可以在命令行上指定要使用的印表機。   lpr命令   lpr命令是脫機列印命令,該命令將列印作業放到列印緩衝佇列中。?Linux系統指定的每台印表機都有自己的列印緩衝目錄,每個目錄中的minfree文件指定保存列印文件的磁片塊的數量。 lpr同lpd守護進程通訊,lpd掃描/etc/printcap文件,查詢印表機對應的緩存目錄,然後由lpd控制列印,將需要列印的資料送到實際印表機上。如果沒有指定文件,lpr就使用標準輸入。   lpr命令的格式?: lpr [-P printer] [#num] [其他選項] [name…] 命令中各選項的含義如下:   -P 指定印表機。如果不用此選項,則使用缺省印表機或環境變數PRINTER指定的印表機。   -m 列印完畢後發送email。   -#num 列印num份。   lpq命令   lpq是緩衝佇列檢查命令,它通過lpd在緩衝區中檢查列印文件,報告指定作業的狀態或指定用戶的所有作業。不帶任何參數的lpq命令顯示現在佇列中的任何作業。lpq命令的顯示結果中一個重要的資訊就是作業標識號(作業ID),它標識一個特定的作業。如果用戶想取消一個挂起的作業,就必須在命令中指定這個標識號。   lpq命令的格式?: lpq [-l] [-P printer] [job #] [user…] 命令中各選項的含義如下:   -P 指定一個印表機,否則使用缺省印表機或環境變數PRINTER指定的印表機。   -l 列印組成作業的所有文件的資訊。 對提交的每一個作業,lpq報告用戶名、在佇列中的級別、組成作業的文件、作業標識以及總的大小等資訊。   lprm命令   lprm命令用於從緩衝佇列中刪除列印作業,用戶可以使用該命令從緩衝佇列中刪除屬於自己的一個或多個列印作業。   lprm命令的格式?: lprm [-P printer] [-] [job #] [user…] 命令中各選項的含義如下:   -P 指定一個印表機,否則使用缺省印表機或環境變數PRINTER指定的印表機。   - 刪除用戶所有的列印作業。   user 刪除佇列中屬於用戶user的作業(只有超級用戶可以這樣做)。   job # 通過指定作業號#刪除某個列印作業,作業號可以通過lpq命令得到,如:   $ lpq -l   lst:ken [job #013ucbarpa]   (standard input) 100 bytes   $ lprm 13   列印緩衝區目錄   對列印而言,有一個非常重要的目錄,就是列印緩衝區目錄,要列印的資料在被列印之前都集中到這�堙C通常一台印表機對應一個列印緩衝區目錄,這樣比較容易管理印表機。例如,系統使用/var/spool/lpd作?主列印緩衝區,每個單獨的印表機都在主列印緩衝區下有一個與這台印表機同名的目錄。因此,名?ps_nff的印表機把/var/spool/lpd/ps_nff作?它的列印緩衝區目錄。 lpc(8) 程式用來控制 lpd 提供列印的列印機。通過 lpc 程式可控制列印機的列印功能、列印任務列隊、重新安排列隊次序和提供列印機和列隊狀況。 lpc 多數用於設置系統時一機配置多列印機的情況。 $ lpc 上述指令啟動 lpc 程式。在不設置任何參數的情況下,這使用戶進入互動模式,此後可開始輸入指令。使用 lpc 的另一個方式是從指令行輸入參數。 $ lpc status all 所有可用的指令均在 lpd 的使用說明(man page)內可以查到。此處列出一些主要指令。指令中作為 選項 列出的部分可以是列印機名(lp、print 等)或關鍵字 all,此處表示所有列印機。 disable 選項 - 不讓列印機再接受新的列印任務 down 選項 - 停止列印機的一切列印 enable 選項 - 允許列印任務進入列印列隊 quit (或 exit) - 停止 lpc 運行 restart 選項 - 重新開始列印機的 lpd status 選項 - 印出列印機的機況 up 選項 - 重新起始並開始新的 lpd abort topq hold ============================================================== · 1.107.3 Print files Description: Candidates should be able to manage print queues and manipulate print jobs. This objective includes adding and removing jobs from configured printer queues and converting text files to postscript for printing. Key files, terms, and utilities include: lpr lpq mpage 把多頁內容列印在一張紙上 · 1.107.4 Install and configure local and remote printers Candidate should be able to install a printer daemon, install and configure a print filter (e.g.: apsfilter, magicfilter). This objective includes making local and remote printers accessible for a Linux system, including postscript, non-postscript, and Samba printers. Key files, terms, and utilities include: lpd checkpc 檢驗/etc/printcap /etc/printcap ~/printcap /etc/apsfilter/*/ /var/lib/apsfilter/*/ /etc/magicfilter/*/ /var/spool/lpd/*/ /etc/lpd.conf LPRng config ============================================================ Q1. 這個系統怎?這?爛?只能列印 6 頁,超過 6 頁就顯示“file too large (文檔太長)”。 A5. 在 /etc/printcap 檔中有一個參數與列印的文檔長度有關。預設值是 1000 盤區(約 500 k)。對 PostScript 這類文檔而言,這大約是 7-8 頁左右的長度。因此務必在印表機的設定中加入下列內容: mx=0 附加這個指令的主要原因是不使用周邊同作。另一個完成這項工作的方法是用 lpr 在周邊同作目錄內對列印的文檔生成軟連接。務必記得每次均需在 lpr 指令中使用 -s 選項。 Q2. 什?是魔術篩檢程式(magic filter)? A3. 魔術篩檢程式是一種根據文檔的種類採取行動的篩檢程式。例如,如果文檔是沒有排版格式的文本文檔時,則利用一般列印方式列印。如果文檔是 PostScript 文檔或其他格式文檔,則用其他方式列印( ghostscript )。常用的魔術篩檢程式有 magicfilter 和 APSfilter。使用這類篩檢程式的一項要點是在安裝篩檢程式之前必需先安裝應用軟體。 需要注意這項要點的理由是在安裝 magicfilter 時,這個魔術篩檢程式會查詢系統中裝有何種列印程式(例如 ghostscript,如果找到 ghostscript,則 magicfilter 就知道它能處理 PostScript 格式的文檔),然後根據找到的列印程式作出相應的設定。如果系統要處理所有列印文檔,可能至少得安裝下列程式: GhostScript TeX NetPBM jpeg utilities (譯注:jpeg 工具軟體) gzip Ghostscript 是 PostScript 印表機類比程式,透過軟體類比,可以讓非 PostScript 印表機,也能印出 PostScript 文件。 ======================================================================== /etc/printcap;/etc/printcap.local (用戶應該修改/etc/printcap.local,而不是;/etc/printcap) 基本上, 要增加一個列印佇列, 你必須在 /etc/printcap 中加一筆記錄, 以及在 /var/spool/lpd 之下建立一個列印暫存器的工作目錄(spool directory). /etc/printcap 中的記錄看起來像這個樣子: # LOCAL djet500 lp|dj|deskjet:\ :sd=/var/spool/lpd/dj:\ :mx#0:\ :lp=/dev/lp0:\ :sh: 這個例子定義了一個名為 lp, dj, 或是 deskjet 的列印暫存器, 暫存器的工作目錄在 /var/spool/lpd/dj, 沒有單一工作大小的上限, 列印的裝置是 /dev/lp0, 而且不會在每一個工作之前加上標題頁 (有著列印人的姓名之類的資料). 上面這個例子看起來非常簡單, 但是有一個問題 - 除非 DeskJet 500 能看懂我送出去的檔案, 否則便會印出亂碼. 舉例來說, 假如送一個傳統的 Unix 文字檔案給 deskjet 會導致新行字元(newline) 被逐字列印, 而得下面的結果: This is line one. This is line two. This is line three. 同樣的, 列印一個 PostScript 檔到這個列印暫存器會得到同樣階梯狀的 PostScript 命令列表, 而不是我們需要的結果. 很顯然我們還需要些什麼, 這就是 filtering 的目的. 看過 printcap 線上手卌的比較細心的讀者可能已經注意到 if 及 of 這兩個屬性. 其中的 if, input filter 就是我們現在所需要的. 假使我們寫個短短的 shell script 叫 filter 使之在新行字元之前加上回車字元(carriage return), 就可以消除階梯狀. 所以我們必須在前面的 printcap 的記錄中加上 if 這一行: lp|dj|deskjet:\ :sd=/var/spool/lpd/dj:\ :mx#0:\ :lp=/dev/lp0:\ :if=/var/spool/lpd/dj/filter:\ :sh: 這個短短的 filter script 可以是: #!perl # The above line should really have the whole path to perl # This script must be executable: chmod 755 filter while(<STDIN>){chop $_; print "$_\r\n";}; # You might also want to end with a form feed: print "\f"; 假如我們照上面的方法, 我們就會得到一個能正常印出普通 Unix 文字檔的列印暫存器. (還有其他四百萬種更好的方法來寫這個命令稿, 但是這個很適合舉例, 你可以自己寫一個更有效率的.) 剩下的唯一問題是只能印出純文字檔實在是不夠好 - 如果能夠印出 PostScript 或是其他格式化的或是圖形輸出就更棒了. 這可以做的到, 也很容易做到. 方法就是延伸前面的 filter. 如果你寫出一個能接受任意檔案格式, 然後針對每種情況都可以產生 DeskJet 所要的資料的 filter, 那你就有了一個智慧型的列印暫存器. 這種 filter 稱之為 magic filter. 你無需自己寫一個, 除非你要印的東西很奇怪. 網路上已經有很多寫好的, APS Filter 就是非常棒的一個. 也說不定你的 Linux 發行版本(distribution) 已經包括了一個印表機設定工具使得這一切都很容易. # /etc/printcap PS|PostScript:\ :sd=/var/spool/lpd/postscript:\ spool目錄 :mx#0:\ 最大任務 :lp=/dev/lp0:\ 列印埠 :if=/var/spool/lpd/postscript/filter:\ 列印篩檢程式 :sh:\