我们的客户有一台Linux服务器(Redhat),上面运行着Java Web应用程序。最近有一个需求,需要将PDF文件提交给打印机进行打印。
我们使用的命令是cat /path/to/pdf_file | acroread -toPostScript | lp -dprintername
。但我们收到了错误lp: stdin is empty; so no job has been sent
。
使用此命令打印普通文件(例如 /etc/hosts)lp -dprintername /etc/hosts
是可行的,我们可以在打印机上看到打印输出。该lp
命令不是问题所在。
我继续测试其他 2 个命令cat /path/to/pdf_file | acroread -toPostScript
并看到了输出Segmentation fault
。
为了进一步解决这个问题,我使用了 strace 命令,如下所示cat /pdf_file | strace -f -o /tmp/acroread.$$.trace acroread -toPostScript
。从跟踪文件中,我在分段错误发生之前看到了这些行。
stat64("/home/oracle/.adobe", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
16673 stat64("/home/oracle/.adobe/Acrobat", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
16673 stat64("/home/oracle/.adobe/Acrobat/9.0", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
16673 stat64("/home/oracle/.adobe/Acrobat/9.0/Temp", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
16673 open("/home/oracle/.adobe/Acrobat/9.0/Temp/AdobeTempPS7XwXNz", O_RDWR|O_CREAT|O_EXCL, 0600) = 4
16673 close(4) = 0
16673 unlink("/home/oracle/.adobe/Acrobat/9.0/Temp/AdobeTempPS7XwXNz") = 0
16673 open("/home/oracle/.adobe/Acrobat/9.0/Temp/AdobeTempPS7XwXNz", O_RDWR|O_CREAT|O_TRUNC, 0666) = 4
16673 getcwd("/var/spool/mail"..., 1024) = 16
16673 open("/home/oracle/.adobe/Acrobat/9.0/Temp/AdobeTempPS7XwXNz", O_RDONLY) = 5
16673 --- SIGSEGV (Segmentation fault) @ 0 (0) ---
16673 +++ killed by SIGSEGV +++
16720 <... waitpid resumed> 0x3, WNOHANG|WCONTINUED|0x7410) = 0
当我列出 /home/oracle/.adobe/Acrobat/9.0/Temp/ 目录时,所有文件的大小都是零字节。
所以,我的问题是,什么可能导致了分段错误?这是 Acrobat Reader 此版本的错误吗?
安装的Acrobat Reader版本是9.4。
RedHat 版本是 Red Hat Enterprise Linux Server 版本 5.7 (Tikanga)。内核是 Linux SCHPOAPS1 2.6.18-274.el5 #1 SMP Fri Jul 8 17:36:59 EDT x86_64 GNU/Linux。
答案1
我认为,当它想要/home/oracle/.adobe/Acrobat/9.0/Temp/AdobeTempPS7XwXNz
两次打开文件时,这是 acroread 的问题。
你能用pdf2ps
代替吗acroread
?
答案2
我们通过删除当前的 Acrobat Reader(版本 9.4)并安装更高版本(9.5.5)解决了这个问题。