Как загрузить переменные среды для процесса службы systemd?

Я разрабатываю сценарии некоторых служб, которые необходимо запускать при загрузке на Raspbian (Jessie), и я решил использовать systemd. Я только начал читать несколько быстрых руководств по его использованию, но у меня проблемы с окружением.

Для выполняемых процессов требуются (в их коде) некоторые переменные среды, которые я установил в сценарии оболочки, но они не загружаются, несмотря на использование EnvironmentFile = / path / to / my / file ... У меня есть служба выполнение сценария Python3 и еще одного для приложения Node.js.

Со вчерашнего дня ищу альтернативные решения, но вроде ничего не работает ... Может я просто не понял, как работает systemd? Это должно быть возможно, поэтому я прошу вас ...

Вот мои файлы юнитов:

Для скрипта python:

[Unit]
Description=My awesome python script
After=multi-user.target

[Service]
ExecStart=/usr/local/bin/python3.6 /home/pi/Desktop/myawesomescript.py
Restart=Always
RestartSec=5
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=mypython
User=pi
EnvironmentFile=/home/pi/.bash_vars

[Install]
WantedBy=multi-user.target

Приложение узла:

[Unit]
Description=My awesome Node.js socket.io app
Requires=After=mypython.service    # Requires the python script to be running

[Service]
ExecStart=/usr/bin/node /home/pi/Desktop/myawesomenodeapp/src/index.js
Restart=always
RestartSec=10
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=mynodeapp
User=pi
EnvironmentFile=/home/pi/.bash_vars

[Install]
WantedBy=multi-user.target

Спасибо, что нашли время, и извините за мой плохой английский!

PS: Пожалуйста, дайте мне знать, если вам нужна дополнительная информация


person zovakk    schedule 04.10.2017    source источник
comment
На всякий случай посмотрите бессмертный   -  person nbari    schedule 04.10.2017
comment
Собственно, ответ DarkKnight помог мне понять, что я упустил. В любом случае спасибо за предложение, я посмотрю и посмотрю, могут ли его функции быть полезными!   -  person zovakk    schedule 05.10.2017


Ответы (1)


Среда может быть установлена ​​в служебном файле systemd, как показано ниже в параметрах Exec.

Environment=LD_LIBRARY_PATH=/usr/lib

Ниже представлена ​​официальная документация по использованию systemd Environment / EnvironmentFile.

Environment =

Устанавливает переменные среды для выполняемых процессов. Принимает список назначений переменных, разделенных пробелами. Эта опция может быть указана более одного раза, и в этом случае будут установлены все перечисленные переменные. Если одна и та же переменная установлена ​​дважды, более поздняя настройка переопределит более раннюю настройку. Если этому параметру присвоена пустая строка, список переменных среды сбрасывается, все предыдущие назначения не действуют. Расширение переменной не выполняется внутри строк, однако расширение спецификатора возможно. Символ $ не имеет особого значения. Если вам нужно присвоить переменной значение, содержащее пробелы или знак равенства, используйте двойные кавычки (") для присвоения.

Пример:

Environment = "VAR1 = word1 word2" VAR2 = word3 "VAR3 = $ word 5 6" дает три переменные "VAR1", "VAR2", "VAR3" со значениями "word1 word2", "word3", "$ word 5 6". ".

См. Environment (7) для получения подробной информации о переменных окружения.

EnvironmentFile =

Подобно Environment =, но считывает переменные среды из текстового файла. Текстовый файл должен содержать назначения переменных, разделенных новой строкой. Пустые строки, строки без разделителя «=» или строки, начинающиеся с; или # будут проигнорированы, что может быть использовано для комментирования. Строка, оканчивающаяся обратной косой чертой, будет объединена со следующей, что позволяет определять многострочные переменные. Анализатор удаляет начальные и конечные пробелы из значений присваиваний, если вы не используете двойные кавычки (").

Переданный аргумент должен быть абсолютным именем файла или выражением с подстановочным знаком, необязательно с префиксом «-», который указывает, что, если файл не существует, он не будет прочитан и сообщение об ошибке или предупреждении не будет зарегистрировано. Эта опция может быть указана более одного раза, и в этом случае будут прочитаны все указанные файлы. Если этой опции присвоена пустая строка, список файлов для чтения сбрасывается, все предыдущие назначения не действуют.

Файлы, перечисленные с помощью этой директивы, будут прочитаны незадолго до выполнения процесса (точнее, после завершения всех процессов из предыдущего состояния модуля. Это означает, что вы можете сгенерировать эти файлы в одном состоянии модуля и прочитать их с помощью этой опции в следующем ).

Настройки из этих файлов переопределяют настройки, сделанные с помощью Environment =. Если одна и та же переменная установлена ​​дважды из этих файлов, файлы будут прочитаны в том порядке, в котором они указаны, и более поздняя настройка переопределит более раннюю настройку.

Дополнительные сведения см. здесь

person DarkKnight    schedule 05.10.2017
comment
Спасибо, я действительно покрасил это, но, может быть, слишком быстро, ха-ха! Я думал, что файл среды должен быть файлом сценария bash, экспортирующим переменные ... Я заставил его работать, исправив синтаксис - person zovakk; 05.10.2017