Systemd에서 ExecStartPre를 사용하여 운영 체제 환경 변수 만들기

Systemd에서 ExecStartPre를 사용하여 운영 체제 환경 변수 만들기

다음과 같은 단위 파일이 있습니다.

[Unit]
Description=Panel for Systemd Services
After=network.target

[Service]
User=pysd
Group=pysd
PermissionsStartOnly=true
WorkingDirectory=/opt/pysd
ExecStartPre=/bin/mkdir /run/pysd
ExecStartPre=/bin/chown -R pysd:pysd /run/pysd
ExecStart=/usr/local/bin/gunicorn app:app -b 127.0.0.1:8100 --pid /run/pysd/pysd.pid --workers=2
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
ExecStopPost=/bin/rm -rf /run/pysd
PIDFile=/run/pysd/pysd.pid
PrivateTmp=true

[Install]
WantedBy=multi-user.target
Alias=pysd.service

환경 변수를 만든 다음 ExecStartPre해당 변수를 ExecStart.

더 구체적으로 말하면, GUNICORN_SERVER실행하기 전에 환경 변수를 만든 ExecStart다음 이 환경 변수 -bExecStart.

비슷한 것을 시도했지만 ExecStartPre=/bin/bash -c 'export GUNICORN_SERVER=127.0.0.1:8100'환경 변수가 생성되지 않았습니다.

이 시나리오를 어떻게 구현합니까?

답변1

ExecStartPre다른 명령에 대한 환경을 직접 설정할 수는 없습니다 . 이는 별도의 프로세스입니다. (간접적으로 파일에 저장하고 읽는 등의 방식으로 가능합니다.)ExecStartPreExecStart

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시스템이 해당 파일을 다음의 일부로 읽도록 하는 것입니다 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 ...'

답변2

실제로 가장 좋은 방법은 --env운영 체제에서 데이터를 읽고 Python 애플리케이션에 통합할 수 있는 환경 변수를 생성하는 Gunicorn을 사용하는 것입니다.

조직 파일에서:

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. 이것문서정말 많은 정보가 있습니다.

관련 정보