Неправильный ioctl для устройства при вызове unoconv из perl-скрипта

Я запускаю сценарий perl с почтового сервера postfix каждый раз, когда получено электронное письмо для указанного домена. Сценарий perl в основном извлекает все вложения, а затем вызывает unoconv, чтобы преобразовать вложения в формат PDF.

В настоящее время я тестирую скрипт со всегда одним и тем же письмом с одинаковыми вложениями и вижу случайное поведение. Иногда все вложения преобразуются, иногда я получаю сообщение об ошибке "Неправильный ioctl для устройства в" ОШИБКА при вызове команды unoconv, например:

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 ответ

Человек 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.
Другие вопросы по тегам