面對文本、PostScript、PCL/RTL 三種格式混合打印需求,標準 lpadmin 單隊列無法同時完美支援。本文記錄從嘗試失敗、雙重緩衝、Perl 智能過濾、日誌追蹤到臨時文件清理的完整演進路徑,最終構建零成本、集中管理、可追蹤的企業級打印服務。
| 設置 | -T 類型 | -I 內容 | 結果 |
|---|---|---|---|
| PS only | PS | PostScript | 文本樓梯效應 |
| Any | unknown | any | PS/二進制變垃圾 |
| Text+PS | PS | text | PCL/RTL 變垃圾 |
| 多 -I 組合 | unknown/PS | PostScript,text,simple 等 | 文本樓梯或二進制損壞 |
lpadmin 不允許 unknown 與其他 -T 共存,單隊列無解。
no1316p:model=standard,介面腳本插入 FILTER=/bin/unix2dos \| lp -s -d no1316p-r。no1316p-r:model=netstandard,默認 unknown/any。unix2dos 破壞二進制文件(PCL/RTL 列印品質極差)。HP JetAdmin 完美支援三格式並提供管理介面,但無法替換 XCD 網卡,方案被否決。
#!/opt/bin/perl
open(FOO, "-"); # stdin
open(OUT, ">/var/spool/lp/save_dir/tmp/$ARGV[0].$$"); # 臨時文件含 request_id
if (-B FOO) { while () { print OUT $_; } } # 二進制直通
else { while () { s/\n/\r\n/; print OUT; } } # 文本 unix2dos
close(FOO); close(OUT);
system("/bin/lp -s -d $ARGV[1] /var/spool/lp/save_dir/tmp/$ARGV[0].$$");
FILTER="/var/spool/lp/save_dir/sbin/lp.pl ${request_id} no1316p-r"。${request_id},網絡隊列 lpq 可見原始請求 ID。${request_id} ${user_name} ${files/flist} 至 request.log。lpq.ksh 解析網絡隊列 lpq 輸出,關聯日誌還原 原始擁有者、文件名,輸出標準 Rank Owner Job File(s) Size 格式。#!/bin/ksh
cd /var/spool/lp/save_dir/tmp
for i in no*; do
grep "^T $i" /var/spool/lp/logs/requests >/dev/null 2>&1 && rm -f $i
done
Cron 每小時執行,利用 requests.log 中 T filename 標記判斷作業完成。
lpq.ksh 還原真實用戶與文件💡 現代替代:CUPS (Common UNIX Printing System) 內建 MIME 類型自動識別與過濾器鏈,支援 IPP/HTTP、集群、ACL、Web 管理介面,建議新環境直接部署 CUPS。