Cara menjalankan perintah di dalam virtualenv menggunakan systemd

15

Saya percaya ini harus sederhana tetapi saya tidak bisa membuatnya bekerja dengan baik.

Ini adalah perintah yang bisa saya jalankan di baris perintah:

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

Perintah-perintah ini harus dilakukan dalam urutan ini. Karena virtualenv, non-executable untuk crossbar, dan skrip python yang terpisah setelah itu, saya belum bisa menemukan cara terbaik untuk mendapatkan ini berfungsi. Pekerjaan saya saat ini dalam proses:

[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
sscirrus
sumber
1
Bisakah Anda menyelesaikannya? Jika ya, bagaimana caranya?
hitam

Jawaban:

11

Ini tidak berfungsi karena sourcemerupakan perintah shell, jadi systemd ExecStart=atau ExecStartPre=tidak akan memahaminya secara langsung ... (BTW, hal yang sama berlaku untuk cddan &&.)

Anda bisa mencapainya dengan menjalankan shell secara eksplisit dan menjalankan semua perintah Anda di sana:

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

Tetapi pendekatan yang lebih baik adalah, alih-alih mencari skrip "aktifkan", untuk menggunakan pythonexecutable di bin/virtualenv Anda secara langsung.

Jika Anda melihat dokumen penggunaan virtualenv , Anda akan melihat tertulis:

ENV/bindibuat, tempat executable hidup - terasa python baru . Dengan demikian menjalankan skrip dengan #! /path/to/ENV/bin/pythonakan menjalankan skrip itu di bawah python virtualenv ini.

Dengan kata lain, dengan asumsi crossbaradalah skrip Python yang ingin Anda jalankan yang memerlukan venv-apvirtualenv, cukup mulai crossbardengan:

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

Dan itu akan secara otomatis menggunakan virtualenv setiap kali dipanggil.

Juga memungkinkan, memanggil juru bahasa Python dari virtualenv secara langsung, dengan:

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

(Juga, mengenai menjalankan di direktori tertentu, pengaturan WorkingDirectory=/home/debian/aplebih baik daripada menggunakan cdperintah. Anda tidak perlu shell seperti itu, dan systemd dapat melakukan penanganan kesalahan yang lebih baik untuk Anda.)

filbranden
sumber