Мой коллега написал 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 или что-то в этом роде, но я понимаю, что это невозможно.
Какие-нибудь советы? Спасибо!
perlbrew
служит для двух целей: 1) оболочка дляperl
установщика и 2) инструмент для манипулирования PATH. Ни один из них не должен быть уместным здесь. - person ikegami   schedule 31.01.2017/home/newlands/.perlbrew/libs/perl-5.20.1@newlands
, где библиотеки на самом деле находятся. э-э, это не то место, гдеperlbrew
-установленныеperl
сборки установить либы. Кажется, вы переопределили место установки? Если это так, вы будете использоватьuse lib ...
внутри своего скрипта или установите переменную окруженияPERL5LIB
. (Ни одна из этих вещей не имеет ничего общего сperlbrew
. Фактически,perlbrew
обычно используется, чтобы избежать подобных действий!) - person ikegami   schedule 31.01.2017EnvironmentFile
кажется прочитанным перед выполнением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