Development Tip

systemd 서비스 유닛에서 virtualenv를 활성화하는 방법은 무엇입니까?

yourdevel 2020. 12. 1. 19:49
반응형

systemd 서비스 유닛에서 virtualenv를 활성화하는 방법은 무엇입니까?


systemd 서비스 파일에서 virtualenv를 "활성화"하고 싶습니다.

systemd 프로세스와 python 인터프리터 사이에 쉘 프로세스가 생기는 것을 피하고 싶습니다.

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

[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의 일부 항목이 누락 되었기 때문에 ImportErrors가 발생합니다.


virtualenv는 "virtualenv의 Python 인터프리터로 구워집니다". , 해당 virtualenv에서 직접 실행 python하거나 console_scripts직접 실행할 수 있으며 먼저 virtualenv를 활성화하거나 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

라이브러리의 경로는 실제로 virtualenv의 파이썬 인터프리터에 구워졌지만 해당 virtualenv에 설치된 바이너리를 사용하는 파이썬 도구에 문제가있었습니다. 예를 들어, 내 아파치 공기 흐름 서비스는 gunicorn바이너리를 찾을 수 없기 때문에 작동하지 않습니다 . 이 문제를 해결하기 위해 여기 ExecStartEnvironment지침 (서비스에 대한 환경 변수 만 설정 함) 과 함께 지침이 있습니다.

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

ExecStartvirtualenv의 파이썬 인터프리터를 명시 적으로 사용합니다. 또한 PATH시스템 앞에 virtualenv의 바이너리 폴더를 추가하는 변수를 추가하고 있습니다 PATH. 그렇게하면 원하는 파이썬 라이브러리와 바이너리를 얻을 수 있습니다.

이 서비스를 구축하기 위해 ansible을 사용하고 있습니다. jinja2의 중괄호를 사용하십시오.


나는 virtualenv가 아니라 pyenv를 사용하고 있습니다. 여기에 shebang에서 실제 .pyenv 경로를 사용하고 PATH에 있는지 확인하십시오.

예 : prod에서 실행중인 사용자 mortenb에 대한 pyenv activate flask-prod

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

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

#!/home/mortenb/.pyenv/versions/flask-prod/bin/python3

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

반응형