猫,pipe和acroread – 为什么它偶尔失败?

在一个简单的shell脚本我试图运行这个命令:

cat /filelocation/myoutput.PDF | /opt/Adobe/Acrobat7.0/bin/acroread -toPostScript 

在大多数情况下,这是工作。 但偶尔,我得到一个错误:

 lp: standard input is empty lp: request not accepted Broken pipe cat: Cannot write to output. 

这似乎只发生在负载繁重的情况下,我们正在处理大量的pdfrecursion。 (用不同的文件反复调用所述shell命令)

你可以使你的shell脚本更简单,看看你是否至less可以得到更好的错误信息:

  /opt/Adobe/Acrobat7.0/bin/acroread -toPostScript < /filelocation/myoutput.PDF 

这也使得build议更好一些:

  strace -f -o /tmp/acroread.$$.strace /opt/Adobe/Acrobat7.0/bin/acroread -toPostScript < /filelocation/myoutput.PDF 

你可以尝试使用pdf2ps:

 pdf2ps [ options ] input.pdf [output.ps] 

或者,您可能需要安装较新版本的Adobe Acrobat。

我假设你正在使用STDOUT / STDIN版本的-toPostScript来pipe道到acroread的输出到lp (在问题中没有显示)。 我有一个感觉,你正在打一个假脱机的问题 – 要么完全填满线轴(这会导致lp到barf)或打其他一些限制。

这个线程讨论了一些无法打印大文件的诊断(虽然我怀疑快速连续打印很多小文件可能导致相同的问题)

  • 检查你的/ var / spool / lp是否有足够的可用空间。
  • 假设/ var / spool是挂载点,请检查此文件系统是否打开了“largefiles”选项。 (可能不适用于你的情况)。

我对打印技术一无所知,但我确实认为这是造成这个问题的原因,而不是catacroread或pipe道 。 (但是,如果您怀疑acroread ,则可以尝试pdf2ps ,即xpdf附带的实用程序)。

发生这种情况是acroread在发送任何输出之前死亡。 没有发现它为什么死了,你没有修理它的机会。 鉴于它是封闭的源代码,你可以做的唯一的事情就是尝试使用strace来查看它在死的时候正在做什么。

  cat /filelocation/myoutput.PDF |  strace -f -o /tmp/acroread.$$.strace /opt/Adobe/Acrobat7.0/bin/acroread -toPostScript 

这会使acroread慢很多,但希望能够在低负载下使其失败,所以应该更快地查看是什么导致了问题。 注意这使用$$来使用脚本的进程ID。 如果您从同一个脚本中多次调用此方法,则需要find其他方法来使用不同的文件。

如果pipe道没有正确closures并且试图重新打开,则可能发生这种情况。 这可能会发生,如果你在沉重的负荷,就像你说的那样。

尝试引入呼叫之间的放缓因素。 也许在对脚本的调用之间抛出一个“等待1”的命令。