создание переменных среды ОС с помощью ExecStartPre в Systemd

Моя первая мысль была такой же, как у Джеффа Шаллера: cut -c 17-64. Однако это включает закрывающую кавычку, поэтому вам нужно cut -c 17-63

Если вам нужно первое слово в кавычках и не все слова одинаковой длины, вы можете использовать awk: awk -F\" '{print $2}' file. txt

0
18.04.2019, 10:27
2 ответа

Вы не можете использовать ExecStartPreдля прямой установки окружения для других команд ExecStartPreили ExecStart. -это все отдельные процессы. (Косвенно, сохраняя в файл и читая его или что-то в этом роде, конечно.)

В Systemd есть два способа установки окружения:Environment=и EnvironmentFile=. Примеры того и другого есть в man 5 systemd.exec. Они влияют на все процессы, запущенные службой, в том числе для ExecStartPre. Если эти переменные не должны устанавливаться динамически, это хороший вариант :

.
Environment=GUNICORN_SERVER=127.0.0.1:8080

Однако, если вам нужно динамически устанавливать переменные, в справочной странице говорится об этомEnvironmentFile:

The files listed with this directive will be read shortly before the process is
executed (more specifically, after all processes from a previous unit state
terminated. This means you can generate these files in one unit state, and read it
with this option in the next).

Таким образом, одним из вариантов было бы записать его в файл в ExecStartPreи заставить systemd прочитать этот файл как частьEnvironmentFile:

EnvironmentFile=/some/env/file
ExecStartPre=/bin/bash -c 'echo foo=bar > /some/env/file'
ExecStart=/some/command  # sees bar as value of $foo

Другим вариантом может быть использование оболочки вExecStart:

ExecStart=/bin/sh -c 'export GUNICORN_SERVER=127.0.0.1:8080; exec /usr/local/bin/gunicorn...'
6
28.01.2020, 02:30

Действительно, лучший подход — использовать --envот Gunicorn, который создает переменную среды в ОС, которую вы можете прочитать и включить данные в свое приложение Python:

В вашем юнит-файле:

ExecStart=/usr/local/bin/gunicorn app:app -b 127.0.0.1:8100 --env GUNICORN_SERVER="127.0.0.1:8100" --pid /run/pysd/pysd.pid --workers=2

В вашем приложении (Flask, например):

import os
from flask import Flask

app = Flask(__name__)

gs = os.getenv('GUNICORN_SERVER')
if gs:
    app.config["SERVER_NAME"] = gs                                              
else:
    app.config["SERVER_NAME"] = "127.0.0.1:8100"

Спасибо за комментарий, JdeBP. Документация действительно содержит много информации.

0
28.01.2020, 02:30

Теги

Похожие вопросы