从 perl 脚本调用 unoconv 时设备的 ioctl 不合适

Posted

技术标签:

【中文标题】从 perl 脚本调用 unoconv 时设备的 ioctl 不合适【英文标题】:Inappropriate ioctl for device at when calling unoconv from perl script 【发布时间】:2015-01-26 10:38:28 【问题描述】:

每次收到指定域的电子邮件时,我都会从 postfix 电子邮件服务器触发 perl 脚本。 perl 脚本基本上是把所有的附件都提取出来,然后调用 unoconv 把附件转换成 PDF 格式。

我目前正在使用带有相同附件的相同电子邮件测试脚本,但我看到了随机行为。有时所有附件都会被转换,有时我在调用 unoconv 命令时收到错误“不适当的 ioctl for device at”错误:

unoconv -f pdf -o /tmp/2151DC80-A545-11E4-880B-D7DC6512523E/ '/tmp/2151DC80-A545-11E4-880B-D7DC6512523E/attachments/21887524-A545-11E4-880B-D7DC6512523E-test.doc'

看起来像一些赛车状况问题或类似问题。可能是什么问题?

更新:问题似乎在于 unoconv 有时会以浮点异常退出,但是文档已成功转换(我可以在 PDF 查看器中打开它)。这里是出现错误的函数的代码。现在的问题是在这种情况下如何进行。

################################################################################
#                       Convert attachments to PDF                             #
################################################################################
sub convertAttachments() 
  $logger->info("converting attachments");
  mkdir  $email_converted_attachment_dir;

  opendir(DIR, $email_attachment_dir) or die $!;
    while (my $file = readdir(DIR)) 
        next if ($file =~ m/^\./);
        $logger->info("Converting attachment: ".$email_attachment_dir.$file);
        $conv_result = "unoconv -v -T 10 -f pdf -o ".$email_converted_attachment_dir." '".$email_attachment_dir.$file."'";
        $logger->info("Running Command: ".$conv_result);
        system($conv_result) and die  "Can't launch unoconv: $!";
    
  closedir(DIR);

【问题讨论】:

继续。提示我们代码实际在做什么。 【参考方案1】:

man unoconv 说:

unoconv uses the LibreOffice’s UNO bindings for non-interactive
   conversion of documents and therefore needs an LibreOffice instance to
   communicate with. Therefore if it cannot find one, it will start its
   own instance for temporary usage. If desired, one can start a
   “listener” instance to use for subsequent connections or even for
   remote connections.

...

-T, --timeout
       When unoconv starts its own listener, try to connect to it for an
       amount of seconds before giving up. Increasing this may help when
       you receive random errors caused by the listener not being ready to
       accept conversion jobs.

【讨论】:

以上是关于从 perl 脚本调用 unoconv 时设备的 ioctl 不合适的主要内容,如果未能解决你的问题,请参考以下文章

使用 Unoconv 将 docx 转换为 pdf 时出错

如何从我的 perl 脚本调用同一目录中的脚本

从cron运行时,Perl脚本不会将STDOUT输出到文件

从 PHP 调用 Perl 脚本并传入变量,同时还使用可变的 perl 脚本名称

从 Perl 脚本执行 .net 命令行应用程序

从 python 调用 perl 脚本在 commands.getstatusoutput 中有效,但在 subprocess.call 中无效