Неправильный 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.