source

systemd 서비스 유닛에서 가상 환경을 활성화하는 방법은 무엇입니까?

gigabyte 2023. 7. 18. 23:03
반응형

systemd 서비스 유닛에서 가상 환경을 활성화하는 방법은 무엇입니까?

systemd 서비스 파일에서 가상 환경을 "활성화"하고 싶습니다.

systemd process와 python interpreter 사이에 셸 프로세스가 발생하는 것을 피하고 싶습니다.

현재 솔루션은 다음과 같습니다.

[Unit]
Description=fooservice
After=syslog.target network.target

[Service]
Type=simple
User=fooservice
WorkingDirectory={{ venv_home }}
ExecStart={{ venv_home }}/fooservice --serve-in-foreground
Restart=on-abort
EnvironmentFile=/etc/sysconfig/fooservice.env

[Install]
WantedBy=multi-user.target

/etc/sysconfig/fooservice.env

PATH={{ venv_home }}/bin:/usr/local/bin:/usr/bin:/bin
PYTHONIOENCODING=utf-8
PYTHONPATH={{ venv_home }}/...
VIRTUAL_ENV={{ venv_home }}

하지만 저는 어려움을 겪고 있습니다.의 일부 항목 때문에 가져오기 오류가 발생합니다.sys.path누락되었습니다.

virtualenv는 "virtualenv의 Python 인터프리터에 구워집니다."즉, 시작할 수 있습니다.python또는 해당 가상 환경에서 직접 가상 환경을 활성화하거나 관리할 필요가 없습니다.PATH당신 자신.:

ExecStart={{ venv_home }}/bin/fooservice --serve-in-foreground

또는

ExecStart={{ venv_home }}/bin/python {{ venv_home }}/fooservice.py --serve-in-foreground

그리고 그것을 제거합니다.EnvironmentFile참가 신청

정확한지 확인하려면 다음을 확인할 수 있습니다.sys.path달리기로

{{ venv_home }}/bin/python -m site

그리고 출력을 비교합니다.

python -m site

라이브러리의 경로는 실제로 가상 환경의 파이썬 인터프리터에 구워지지만, 저는 해당 가상 환경에 설치된 바이너리를 사용하는 파이썬 도구에 문제가 있었습니다.예를 들어, 아파치 공기 흐름 서비스가 작동하지 않을 것입니다. 왜냐하면 그것이 그것을 찾을 수 없었기 때문입니다.gunicorn이진의이 문제를 해결하려면 다음과 같이 하십시오.ExecStart지시, 포함Environment명령(서비스 전용 환경 변수를 설정함).

ExecStart={{ virtualenv }}/bin/python {{ virtualenv }}/bin/airflow webserver
Environment="PATH={{ virtualenv }}/bin:{{ ansible_env.PATH }}"

ExecStart가상 환경의 파이썬 인터프리터를 명시적으로 사용합니다.또한 추가합니다.PATHvariable - 시스템 앞에 가상 환경의 이진 폴더를 추가합니다.PATH그렇게 하면 바이너리뿐만 아니라 원하는 파이썬 라이브러리를 얻을 수 있습니다.

이 서비스를 구축하기 위해 책임을 사용하고 있습니다. jinja2의 꼬불꼬불한 중괄호로 이동하십시오.

제 경우에는 플라스크에 필요한 환경 변수를 추가하려고 했습니다.

[Service]
Environment="PATH=/xx/yy/zz/venv/bin"
Environment="FLASK_ENV=development"
Environment="APP_SETTINGS=config.DevelopmentConfig"

가상 환경을 사용하고 있었기 때문에/xx/yy/zz/venv/binvirtualenv 폴더의 경로입니다.

나는 virtualenv를 사용하는 것이 아니라 pyenv를 사용하고 있다: 여기는 단지 shebang에서 실제 .pyenv 경로를 사용하고 그것이 PATH에 있는지 확인하기 위한 것이다.

예: prod에서 실행 중인 사용자 mortenb용 pyenv 활성화 플라스크-prod

/home/mortenb/.pyenv/versions/flask-prod/bin/python --version
Python 3.6.2

그런 다음 systemd *.service로 시작하는 플라스크 스크립트에 다음 셰방을 추가합니다.

#!/home/mortenb/.pyenv/versions/flask-prod/bin/python3
ExecStart=cd /root/app/working-directory && poetry run python my_app.py

언급URL : https://stackoverflow.com/questions/37211115/how-to-enable-a-virtualenv-in-a-systemd-service-unit

반응형