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
가상 환경의 파이썬 인터프리터를 명시적으로 사용합니다.또한 추가합니다.PATH
variable - 시스템 앞에 가상 환경의 이진 폴더를 추가합니다.PATH
그렇게 하면 바이너리뿐만 아니라 원하는 파이썬 라이브러리를 얻을 수 있습니다.
이 서비스를 구축하기 위해 책임을 사용하고 있습니다. jinja2의 꼬불꼬불한 중괄호로 이동하십시오.
제 경우에는 플라스크에 필요한 환경 변수를 추가하려고 했습니다.
[Service]
Environment="PATH=/xx/yy/zz/venv/bin"
Environment="FLASK_ENV=development"
Environment="APP_SETTINGS=config.DevelopmentConfig"
가상 환경을 사용하고 있었기 때문에/xx/yy/zz/venv/bin
virtualenv 폴더의 경로입니다.
나는 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
'source' 카테고리의 다른 글
PyMongo에서 MongoDB 컬렉션을 삭제하는 방법 (0) | 2023.07.18 |
---|---|
폭 우선 검색에서 경로를 추적하는 방법은 무엇입니까? (0) | 2023.07.18 |
실행 중인 X 서버 없이 matplotlib 그래프 생성 (0) | 2023.07.18 |
boto를 사용하여 S3 버킷의 디렉토리에 파일을 업로드하는 방법 (0) | 2023.07.18 |
시스템에서 RVM(Ruby Version Manager)을 제거하는 방법 (0) | 2023.07.18 |