![如何让点阵打印机打印每一行“tail -f”](https://linux22.com/image/19712/%E5%A6%82%E4%BD%95%E8%AE%A9%E7%82%B9%E9%98%B5%E6%89%93%E5%8D%B0%E6%9C%BA%E6%89%93%E5%8D%B0%E6%AF%8F%E4%B8%80%E8%A1%8C%E2%80%9Ctail%20-f%E2%80%9D.png)
我有一台点阵打印机,Epson LQ-500。
它与 CUPS 配合得很好,我有时用它来打印列表、文本文件等。
现在,我想用它作为日志打印机。为此,当它附加到文件或命名管道时,我需要它打印一行。
我正在考虑使用这样的东西:
tail -n1 -f file | lpr -l -h -P Epson-LQ-500
但它不起作用,打印作业一直被保留。然后我尝试了这个:
tail -n1 -f file | lp -d Epson-LQ-500 -o raw -H immediate
它也不起作用,打印作业被无限期地保留。
当使用tail
without时-f
,或者使用cat
它时,一切都工作正常,但 CUPS 只是不会让它逐行打印。
那么,我该怎么做呢?
答案1
CUPS系统是一台打印机假脱机程序(即,它假设打印机是共享的;它收集要打印的东西,只有在完成时才将其发送到打印机,为了在发送页眉时不延迟其他人的打印输出,请执行1/2小时计算然后打印其余部分)。
解决此问题的最简单方法是将输出直接发送到打印机设备(这可能意味着首先让 CUPS 相信它应该不管它,并确保打印机确实理解发送给它的文本)。
答案2
tail -f file > /dev/lp0
假设有并行打印机和适当的权限,并且您无法共享打印机。
答案3
我用这个解决了这个问题:
tail -n2 -f file | while read line
do
echo $line | lpr -l -h -P Epson-LQ-500
done
但我不确定这是否是最佳实践。
答案4
tail -n2 -f file | while read line
do
echo $line | lpr -l -h -P Epson-LQ-500
done
老式行式打印机因其即时性而非常有用。当一个角色被抛弃时/dev/lp0,它直接进入无法破解的纸张。
如果您跟踪该文件是为了捕获入侵(或系统崩溃),则在将其添加到系统之前,您已经添加了经过越来越多软件步骤(shell、lpr、打印机过滤器)的线路的延迟和不安全性。页。
如果计算机崩溃或断电或有人侵入 lpr,打印机将无法准确记录事件。
对于非关键的事情,如果能提供其他便利那就太好了;我使用旧的行式打印机一次打印一个标签(激光打印机要求我打印一整张纸)。
如果需要将时间或安全性关键的内容发送到打印机,请使用
tail -f file > /dev/lp0
(虽然如果是真的您需要记录到纸上的关键信息,您可以在内核中完全绕过 shell 和文件系统。)
老式行式打印机不需要任何实时打印纯文本的驱动程序。