Bir systemd hizmet biriminde bir virtualenv nasıl etkinleştirilir?


87

Bir systemd hizmet dosyasında bir virtualenv'i "etkinleştirmek" istiyorum.

Systemd süreci ile python yorumlayıcısı arasında bir kabuk sürecine sahip olmaktan kaçınmak istiyorum.

Mevcut çözümüm şuna benziyor:

[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 }}

Ama sorun yaşıyorum. Sys.path içindeki bazı öğeler eksik olduğu için ImportErrors alıyorum.


Lütfen aldığınız hataları da ekleyebilir misiniz?
Praveen Yalagandula

@PraveenYalagandula İçe Aktarım Hatası İstisnası ve onun üzerindeki tüm satırlar burada önemi olmayan özel kod içerdiğinden, geri bildirim yararlı bilgiler içermez.
guettli

Yanıtlar:


117

Virtualenv "virtualenv'deki Python yorumlayıcısında pişirilir". Bu araçlar size başlatabilir pythonveya console_scriptsdoğrudan o virtualenv ve ilk VIRTUALENV etkinleştirmek veya yönetmek gerekmez PATHkendini .:

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

veya

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

ve EnvironmentFilegirişi kaldırın .

Bunun gerçekten doğru olduğunu doğrulamak için sys.pathçalıştırarak kontrol edebilirsiniz.

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

ve çıktının karşılaştırılması

python -m site

2
iyi nokta Nils. Btw, fooservice.py venv_home dizininin içinde olmak mantıklı değil, sanırım sorudaki bir yazım hatası.
stelios

4
Önerilen yazdırma komutlarının Python 3 ile uyumlu olmadığını unutmayın. En azından python 2.4 kullanıyorsanız, alternatif olarak python -m site, ek bilgilerle birlikte sys.path değişkeninin güzel bir şekilde biçimlendirilmiş çıktısını almak için kullanabilirsiniz .
Mark Edington

2
Neat, bilmiyordum python -m site. Cevabımı değiştirdim.
Nils Werner

1
@NilsWerner Bunu bir kabuk oluşturarak çözdüm , Ubuntu 17.10'da başka hiçbir şey işe yaramadı: github.com/umccr/pcgr-deploy/blob/master/ansible/files/… ... lütfen yanıtlanabilir için jinja2 şablonunu dikkate almayın, bu konuşlandırıldığında doğru şekilde genişler.
beyin fırtınası

6
Bunun ninja2 olup olmadığını merak edenler için .... hayır, çift küme parantezleri sadece OP'nin icat ettiği yer tutuculardır: superuser.com/questions/1209919/…
ankostis

12

Kitaplıkların yolu gerçekten virtualenv'in python yorumlayıcısına yerleştirilmiş olsa da, bu virtualenv'de kurulu ikili dosyaları kullanan python araçlarıyla ilgili sorunlar yaşadım. Örneğin, apache hava akışı hizmetim çalışmıyor çünkü gunicornikili dosyayı bulamıyor . Bunu aşmak için, işte ExecStarttalimatım, bir Environmenttalimatla (yalnızca hizmet için bir ortam değişkeni belirleyen).

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

ExecStartvirtualenv'in python yorumlayıcısını açıkça kullanır. Ayrıca PATHsistemden önce virtualenv'in ikili klasörünü ekleyen bir değişken ekliyorum PATH. Bu şekilde, istenen python kitaplıklarını ve ikili dosyaları elde ederim.

Bu hizmeti oluşturmak için ansible kullandığımı unutmayın, ergo jinja2'nin küme parantezlerini.


1

Virtualenv değil pyenv kullanıyorum: işte sadece shebang'da gerçek .pyenv yolunu kullanmak ve PATH'de olduğundan emin olmak

Ör: pyenv, prod'da çalışan mortenb kullanıcısı için flask-prod'u etkinleştirin

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

Sonra systemd * .service ile başlayan flask betiklerime aşağıdaki shebang'ı ekliyorum:

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

0

Benim durumumda, örneğin Flask için gerekli olan ortam değişkenlerini eklemeye çalıştım.

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

Virtualenv kullanıyordum /xx/yy/zz/venv/binda virtualenv klasörünün yolu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.