एक systemd सेवा इकाई में virtualenv कैसे सक्षम करें?


85

मैं एक virtualenv को एक systemd सर्विस फ़ाइल में "सक्रिय" करना चाहता हूँ।

मैं प्रणाली प्रक्रिया और अजगर दुभाषिया के बीच एक खोल प्रक्रिया करने से बचना चाहूंगा।

मेरा वर्तमान समाधान इस तरह दिखता है:

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

लेकिन मुझे परेशानी हो रही है। मुझे इंश्योरेंस मिलता है क्योंकि कुछ लोग एसआईपीएस में प्रवेश करते हैं। लापता हैं।


क्या आप कृपया उन त्रुटियों को शामिल कर सकते हैं जो आपको मिल रही हैं?
प्रवीण यालागांडुला

@PraveenYalagandula ट्रेसबैक में कोई उपयोगी जानकारी नहीं है, क्योंकि ImportError अपवाद और इसके ऊपर की सभी पंक्तियों में केवल कस्टम कोड होता है जो यहां कोई मायने नहीं रखता है।
18ett में guettli

जवाबों:


112

Virtualenv "virtualenv में पायथन दुभाषिया में बेक किया गया है"। इसका मतलब है कि आप उस 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

2
अच्छी बात है। Btw, fooservice.py मतलब नहीं है अंदर venv_home निर्देशिका होना, मैं सवाल में एक टाइपो लगता है।
स्टेलियोस

4
ध्यान दें कि सुझाए गए प्रिंट कमांड पायथन 3 के साथ संगत नहीं हैं। यदि आप कम से कम अजगर 2.4 का उपयोग कर रहे हैं, तो आप वैकल्पिक रूप से सिर्फ उपयोग कर सकते हैं: python -m siteअतिरिक्त जानकारी के साथ sys.path चर का एक अच्छा स्वरूपित आउटपुट प्राप्त करने के लिए।
मार्क एडिंगटन

2
नीट, मुझे इसके बारे में पता नहीं था python -m site। मैंने अपना उत्तर समायोजित कर लिया है।
निल्स वर्नर

1
@ निल्सवर्नर मैंने एक शेल को खोलकर इसे हल किया, कुछ और नहीं उबंटू 17.10 पर काम किया: github.com/umccr/pcgr-deploy/blob/master/ansible/files/… ... ansible के लिए jinja2 templating को नजरअंदाज करें, यह तैनात होने पर सही ढंग से फैलता है।
मंथन

6
सोच है कि अगर यह ninja2 है .... नहीं, उन लोगों के लिए डबल घुंघराले-ब्रेसिज़ सिर्फ प्लेसहोल्डर ओपी का आविष्कार कर रहे हैं: superuser.com/questions/1209919/...
ankostis

11

जबकि पुस्तकालयों के लिए पथ वास्तव में virtualenv के अजगर दुभाषिया में बेक किया गया है, मेरे पास अजगर उपकरण के साथ समस्याएँ हैं जो उस virtualenv में स्थापित बायनेरिज़ का उपयोग कर रहे थे। उदाहरण के लिए, मेरी अपाचे एयरफ्लो सेवा काम नहीं करेगी क्योंकि यह gunicornबाइनरी नहीं मिल सकी । इसके चारों ओर काम करने के लिए, यहां ExecStartएक Environmentनिर्देश के साथ मेरा निर्देश है, (जो सेवा के लिए एक पर्यावरण चर सेट करता है)।

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

ExecStartवर्चुअन के अजगर इंटरप्रेटर का स्पष्ट रूप से उपयोग करता है। मैं एक PATHवैरिएबल भी जोड़ रहा हूं , जो सिस्टम से पहले virtualenv के बाइनरी फ़ोल्डर को जोड़ता है PATH। इस तरह, मुझे वांछित अजगर पुस्तकालय के साथ-साथ बायनेरिज़ भी मिलते हैं।

ध्यान दें कि मैं इस सेवा का निर्माण करने के लिए ansible का उपयोग कर रहा हूं, jinja2 के घुंघराले ब्रेस को मिटा दें।


1

मैं virtualenv का उपयोग नहीं कर रहा हूँ, लेकिन pyenv: यहाँ यह सिर्फ असली .pyenv पथ का उपयोग करने के लिए है और सुनिश्चित करें कि यह पथ में है

पूर्व: pyenv उपयोगकर्ता मोर्टेनब के लिए फ्लास्क-ठेस को सक्रिय करता है जो कि ठेस में चल रहा है

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

तब मेरी फ्लास्क लिपियों को systemd * .service में शुरू करके मैं निम्नलिखित शेबंग जोड़ता हूँ:

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

0

मेरे मामले में मैंने उदाहरण के लिए फ्लास्क के लिए आवश्यक पर्यावरण चर जोड़ने की कोशिश की

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

मैं virtualenv का उपयोग कर रहा था इसलिए /xx/yy/zz/venv/binvirtualenv फ़ोल्डर का पथ है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.