Я создал приложение и модуль 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
работали.