Systemd kullanarak bir virtualenv içinde bir komut nasıl çalıştırılır


15

Bunun basit olması gerektiğine inanıyorum ama düzgün çalışmasını sağlayamıyorum.

Bunlar komut satırında çalıştırabileceğim komutlar:

cd /home/debian/ap

# Start a virtualenv
source venv-ap/bin/activate

# This needs to happen inside the virtualenv and takes ~20 seconds
crossbar start

# Outside the virtualenv, perhaps in a different command line window
python3 /home/debian/myscript.py

Bu komutların bu sırayla yapılması gerekir. Virtualenv, çapraz çubuk için çalıştırılamayan ve daha sonra ayrı bir python komut dosyası nedeniyle, bunun işe yaramasını sağlamanın en iyi yolunu bulamadım. Şu anda devam etmekte olan çalışmam:

[Unit]
Description=Start CB
After=network.target

[Service]
Type=simple
User=debian
ExecStartPre=source /home/debian/ap/venv-ap/bin/activate
ExecStart=cd /home/debian/ap/ && crossbar start
Restart=always

[Install]
WantedBy=multi-user.target

1
Henüz çözebilir misiniz? Öyleyse nasıl?
siyah

Yanıtlar:


11

Bu sourcebir kabuk komutu olduğu için çalışmaz , bu yüzden systemd'ler ExecStart=veya ExecStartPre=doğrudan anlamazlar ... (BTW, aynısı cdve için de geçerlidir &&.)

Sen olabilir açıkça bir kabuk çalışan ve orada birlikte tüm komutları çalıştırarak Bunu başarmak:

ExecStart=/bin/sh -c 'cd /home/debian/ap/ && source venv-ap/bin/activate && crossbar start'

Ancak daha iyi bir yaklaşım, "enable" betiğini kullanmak yerine, doğrudan virtualenv'inizdeki pythonçalıştırılabilir dosyayı kullanmaktır bin/.

Virtualenv'in kullanım belgesine bakarsanız, şunu göreceksiniz:

ENV/binyürütülebilir dosyaların yaşandığı yerde yaratılır - fark edilir şekilde yeni bir python . Böylece, bir script'in #! /path/to/ENV/bin/pythonçalıştırılması bu script'in bu sanal kodun pitonu altında çalışmasını sağlar.

Başka bir deyişle, sanalenv crossbargerektiren, çalıştırmak istediğiniz Python betiği olduğunu venv-apvarsayalım crossbar:

#!/home/debian/ap/venv-ap/bin/python

Ve her çağrıldığında sanalenv'i otomatik olarak kullanacaktır.

Ayrıca, Python yorumlayıcısını doğrudan virtualenv'den çağırmak,

ExecStart=/home/debian/ap/venv-ap/bin/python /path/to/crossbar start

(Ayrıca, belirli bir dizinde çalıştırma ile ilgili ayar WorkingDirectory=/home/debian/ap, bir cdkomut kullanmaktan daha iyidir . Bu şekilde bir kabuğa ihtiyacınız yoktur ve systemd sizin için daha iyi hata işleme yapabilir.)

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.