Назад | Перейти на главную страницу

Systemd Environment и EnvironmentFile не работают

Я создал приложение и модуль systemd для него. Модуль systemd работает нормально, но поскольку среды dev и prod разошлись, я начал переносить конфигурацию в переменные среды, и я не могу заставить их работать в systemd.

Я пробовал общесистемные переменные среды, и они видны ОС, но не программе, поэтому я начал искать их в модулях systemd.

Сначала я попробовал использовать EnvironmentFile

Я создал файл среды, в котором просто

LCSQLH=localhost
LCSQLU=application

в нем как /etc/lc.sh и

[Unit]
Description=Service for this app

[Service]
EnvironmentFile=/etc/lc.sh
ExecStart=/usr/bin/env python /opt/app/__init__.py

сделал systemctl --system daemon-reload но нет, в моем приложении возникла ошибка:

Jan 27 14:24:59 machine.host env[630]: KeyError: 'LCSQLU'

Я видел, что у некоторых было:

EnvironmentFile=-/etc/lc.sh

Я пробовал это .... нет ...

Поэтому я попытался вставить их по отдельности

[Service]
Environment="LCSQLH=localhost"
Environment="LCSQLU=application"
ExecStart=/usr/bin/env python /opt/app/__init__.py

И снова нет ...

Так я услышал об идее /etc/systemd/service_name.service.d поэтому я поместил туда service.conf со средами (в том же формате, что и выше), но нет ...

У моего приложения нет доступа к этим переменным среды.

Если я экспортирую их (вручную в своей оболочке или с помощью /etc/profile.d/) и запускаю свое приложение напрямую, оно работает, так что они не устанавливаются, а не проблема приложения.

Это Centos 7.3, и я выбрал переменные среды, а не жестко запрограммированную конфигурацию, потому что она может работать как в Linux, так и в Windows, поэтому не хочу закапывать файл конфигурации в / etc /

Environment и EnvironmentFile установить переменные, используемые устройством, но как sh команда, не экспортирует ее в дочерние процессы. Для этого вам также необходимо указать его в PassEnvironment, так же, как и с export команда оболочки. Видеть документация systemd по EnvironmentFile и PassEnvironment

Также обратите внимание, что содержимое EnvironmentFile - это не сценарий оболочки, а пары ключ-значение, которые слишком похожи на sh, поэтому назовите его .sh расширение вводит в заблуждение.

Я столкнулся с той же проблемой на RHEL 7.3 и обнаружил этот:

Затем вы можете обратиться к переменным, установленным в /etc/sysconfig/httpd файл с ${FOOBAR} и $FOOBAR, в ExecStart линии (и связанные строки).

Это заставляет меня думать, что цель Environment и EnvironmentFile это совсем не то, что мы с вами ожидали (установка переменных среды для процесса, запущенного модулем systemd), но применяется только для немедленного расширения ExecStart линия.

Возможно я совсем не в базе и это ошибка в systemd (надеюсь на это). Но я перестал идти по пути, который вы пытаетесь сделать, и сделал это по-другому: в моем случае мне нужно было установить LD_LIBRARY_PATH, поэтому я сделал это, создав /etc/ld.so.conf.d/new_file.conf а затем бег ldconfig. Я также попытался использовать общесистемные переменные в /etc/profile.d/new_file.sh, но, видимо, просто LD_LIBRARY_PATH было достаточно для этой службы (mariadb), поэтому я действительно не знаю, были ли переменные, которые я устанавливал в /etc/profile.d/new_file.sh работали.