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
바이너리를 찾을 수 없기 때문에 작동하지 않습니다 . 이 문제를 해결하기 위해 여기 ExecStart
에 Environment
지침 (서비스에 대한 환경 변수 만 설정 함) 과 함께 지침이 있습니다.
ExecStart={{ virtualenv }}/bin/python {{ virtualenv }}/bin/airflow webserver
Environment="PATH={{ virtualenv }}/bin:{{ ansible_env.PATH }}"
ExecStart
virtualenv의 파이썬 인터프리터를 명시 적으로 사용합니다. 또한 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
'Development Tip' 카테고리의 다른 글
g ++에서 포함 경로 덤프 (0) | 2020.12.01 |
---|---|
Android의 VS 코드. (0) | 2020.12.01 |
모듈의 자식으로 모듈에 라우팅하는 방법-Angular 2 RC 5 (0) | 2020.12.01 |
비 어휘 수명이란 무엇입니까? (0) | 2020.12.01 |
PDF를 두 개로 분할 (0) | 2020.11.30 |