systemd для приложения perlbrew?

Мой коллега написал psgi-приложение Dancer под названием «Newlands», в котором используется perlbrew. Я пытаюсь запустить приложение при запуске системы с помощью systemd. У меня есть этот служебный файл:

[Unit]
Description=Newlands
After=network-online.target

[Service]
Type=forking
User=newlands
WorkingDirectory=/home/newlands/working/newlands
PIDFile=/home/newlands/newlands.pid
ExecStartPre=/bin/bash -c 'env > /tmp/newlands.environment'
ExecStartPre=/bin/mkdir -p /tmp/newlands/newlands/session/
ExecStart=/usr/local/bin/starman --host 127.0.0.1 --listen :5000 --env production --preload-app --workers 12 --daemonize --error-log /var/log/newlands/newlands.error.log --pid /home/newlands/newlands.pid bin/newlandia.psgi
EnvironmentFile=-/tmp/newlands.environment
Restart=always

[Install]
WantedBy=multi-user.target

Однако даже с трюком ExecStartPre (который я получил от http://tech.akom.net/archives/93-Getting-a-systemd-unit-to-read-your-.bashrc-file-for-its-environment.html, модифицированный без использования параметра --login), ни одна из переменных среды, связанных с perlbrew, не устанавливается должным образом. Таким образом, я получаю ошибки, указывающие на то, что отсутствующие библиотеки не найдены в @INC, когда @INC ничего не содержит в /home/newlands/.perlbrew/libs/perl-5.20.1@newlands, где библиотеки на самом деле находятся.

Кажется, что выводимый файл в /tmp/newlands.environment по-прежнему значительно отличается от вывода «env», когда он фактически вошел в систему как пользователь newlands. Я хотел бы получить /opt/perlbrew/etc/bashrc или что-то в этом роде, но я понимаю, что это невозможно.

Какие-нибудь советы? Спасибо!


person Josh Rosenberg    schedule 31.01.2017    source источник
comment
Re ни одна из переменных среды, связанных с perlbrew, не устанавливается должным образом, perlbrew служит для двух целей: 1) оболочка для perl установщика и 2) инструмент для манипулирования PATH. Ни один из них не должен быть уместным здесь.   -  person ikegami    schedule 31.01.2017
comment
Re Итак, я получаю ошибки, указывающие на то, что отсутствующие библиотеки не найдены в @INC, когда @INC ничего не содержит в /home/newlands/.perlbrew/libs/perl-5.20.1@newlands, где библиотеки на самом деле находятся. э-э, это не то место, где perlbrew-установленные perl сборки установить либы. Кажется, вы переопределили место установки? Если это так, вы будете использовать use lib ... внутри своего скрипта или установите переменную окружения PERL5LIB. (Ни одна из этих вещей не имеет ничего общего с perlbrew. Фактически, perlbrew обычно используется, чтобы избежать подобных действий!)   -  person ikegami    schedule 31.01.2017
comment
На самом деле то, что вы пытаетесь сделать, работает, но только если вы разделите его на две службы. Причина этого в том, что EnvironmentFile кажется прочитанным перед выполнением ExecStartPre команд. Поэтому, если вы создадите еще одну службу Type=oneshot с именем myapp_env.service, которая генерирует файл вашей среды, и в своем myapp.service добавите Requires=app_env.service и After=app_env.service в раздел Unit, все будет хорошо. В случае perlbrew-приложения это будет source $PERLBREW_ROOT/etc/bashrc, а затем передать вывод printenv для создания вашего файла.   -  person Robin Smidsrød    schedule 17.02.2019


Ответы (1)


Решение состоит не в том, чтобы слепо сбрасывать среду командной строки Bash в среду systemd, а в том, чтобы понять, какие переменные среды вам нужны, и установить их.

Как указывает @ikegami, ваша проблема, вероятно, связана с переменной среды PERL5LIB. Поэтому запустите свое приложение из интерфейса командной строки и выгрузите значение $ENV{PERL5LIB}, чтобы увидеть, какое значение ожидает приложение, а затем установите его в systemd. Возможно, вам придется повторить процесс с другими переменными.

Результатом будет четко и точно определенная среда systemd, в которой ваше приложение будет работать стабильно и последовательно, независимо от того, как будет изменено ваше .bashrc.

person Mark Stosberg    schedule 31.01.2017