다음과 같은 단위 파일이 있습니다.
[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
다음 이 환경 변수 -b
를 ExecStart
.
비슷한 것을 시도했지만 ExecStartPre=/bin/bash -c 'export GUNICORN_SERVER=127.0.0.1:8100'
환경 변수가 생성되지 않았습니다.
이 시나리오를 어떻게 구현합니까?
답변1
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
시스템이 해당 파일을 다음의 일부로 읽도록 하는 것입니다 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. 이것문서정말 많은 정보가 있습니다.