Ошибка в функции createSettingsDocument (elements.cxx) при использовании команды libreoffice

Когда я запускаю следующий скрипт как пользователь root, powerpoint файл преобразовывает в PDF. Когда я запускаю следующий скрипт как не пользователь root или пользователь на моем веб-сервере, я получаю ошибки ниже. При поиске решения по этой проблеме я нашел много ссылок на решение, имеющее отношение к .config файлу или .libreoffice файлу. Я не полагаю, что у меня есть эти файлы. Я установил использование libreoffice склонного - получают установку libreoffice.

Это - .php файл, который я выполняю:

exec("libreoffice --headless --invisible --convert-to pdf ./general.pptx 2>&1", $output, $return);

print_r($output);

Это - результат для не пользователя root:

Array
(
    [0] => [Java framework] Error in function createSettingsDocument (elements.cxx).
    [1] => javaldx failed!
    [2] => Warning: failed to read path from javaldx
)
6
задан 25 September 2015 в 04:25

2 ответа

Я решил свою проблему путем добавления этого:

export HOME=/tmp &&

вначале, например:

export HOME=/tmp && libreoffice --headless --invisible --convert-to pdf ./general.pptx 2>&1

Это работало на меня на Ubuntu 16.04, и как shell_exec() в PHP

6
ответ дан 25 September 2015 в 14:25
  • 1
    Isn' t это не корректная команда для Аппаратных стопок реализации возможностей, а также если Вы должны сказать 14.04.5 won' t эта установка регулярные 14,04 ядер? – ianorlin 15 December 2016 в 10:17

После некоторого поиска с помощью Google и проверки исходного кода я могу объяснить, что является первопричиной блокировки последующих libreoffice экземпляров, работающих от той же учетной записи пользователя. В первую очередь, это похоже на намеренное поведение, так как все рабочие экземпляры совместно используют тот же кэш и конфигурируют директоров и могли разбить его при использовании его несинхронизируемым способом. Все рабочие экземпляры при запуске синхронизируются друг с другом через/tmp/OSL_blabla сокет Unix. Вот связанные отчеты об ошибках, где этот файл сокета упоминается ( https://bugzilla.redhat.com/show_bug.cgi? id=666603 https://bz.apache.org/ooo/show_bug.cgi? id=55154).

можно ближе изучить исходный код, чтобы видеть, как название файла сокета определяется и как синхронизируются экземпляры: https://code.woboq.org/libreoffice/libreoffice/desktop/unx/source/start.c.html#get_pipe_path и https://code.woboq.org/libreoffice/libreoffice/desktop/unx/source/start.c.html#connect_pipe

, Получающий имя канала, довольно сложен. Они сначала обнаруживают 'bootstraprc' имя файла, открывают его и читают переменный 'UserInstallation' оттуда ( https://wiki.openoffice.org/wiki/Bootstraprc). местоположение bootstraprc является конкретным распределением в моем случае (OracleLinux 7.5), это здесь "/usr/lib64/libreoffice/program/bootstraprc":

[ErrorReport]
ErrorReportPort=80
ErrorReportServer=report.libreoffice.org
[Bootstrap]
InstallMode=<installmode>
ProductKey=LibreOffice 5.3
UserInstallation=$SYSUSERCONFIG/libreoffice/4

В $SYSUSERCONFIG Linux "$HOME/.config". Затем они получают сумму 'md5' от местоположения пути файла конфигурации и используют его для определения местоположения разъема. Таким образом, местоположение файла конфигурации отображается для снабжения имени сокетом. Необходимо только изменить путь dir конфигурации для нескольких экземпляров, таким образом, они не заблокировали бы. НО dir конфигурации не является единственным местом, где Вы могли получить удар данных или блокировка. Существуют другие, освобождает (как libGL), что использование совместно использовало кэш ($HOME/.cache/mesa)

, можно проверить, который освобождает попытку читать который переменная среды с 'ltrace':

ltrace -e getenv  -f sh -c "libreoffice --headless --convert-to pdf ./general.pptx"

Вы видите, что все освобождает зависящий от 'ДОМАШНЕГО' dir, таким образом, легче изменить его прежде, чем выполнить несколько экземпляров. Просто сделайте это уникальным для каждого выполнения (и не '/tmp' для всех, который ограничивает нас для выполнения только 2 параллельных преобразователей, но не больше).

я был бы совет заставить временный файл соединить каналом каждый раз, когда необходимо преобразовать и удалить его сразу после преобразования, которое может быть сделано с простой оберткой '/usr/bin/libreoffice_run_many':

#!/bin/sh
dir=`mktemp -d`
if [ -d $dir ]; then
  HOME=$dir
  export HOME
  libreoffice $@
  rm -Rf $dir
fi

Затем просто обертка вызова вместо 'libreoffice':

exec("/usr/bin/libreoffice_run_many --headless --invisible --convert-to pdf ./general.pptx 2>&1", $output, $return);

print_r($output);
2
ответ дан 1 October 2019 в 11:10

Другие вопросы по тегам:

Похожие вопросы: