Come eseguire un comando all'interno di virtualenv usando systemd


15

Credo che questo dovrebbe essere semplice ma non riesco a farlo funzionare correttamente.

Questi sono i comandi che posso eseguire sulla riga di comando:

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

Questi comandi devono essere eseguiti in questo ordine. A causa di virtualenv, il non eseguibile per crossbar e lo script python separato in seguito, non sono stato in grado di capire il modo migliore per farlo funzionare. Il mio attuale work-in-progress:

[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
Potresti risolverlo ancora? Se é cosi, come?
nero,

Risposte:


11

Questo non funziona perché sourceè un comando shell, quindi systemd ExecStart=o ExecStartPre=non li capirà direttamente ... (A proposito, lo stesso vale per cde il &&.)

Si potrebbe raggiungere questo eseguendo una shell in modo esplicito e l'esecuzione di tutti i comandi insieme lì:

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

Ma un approccio migliore è, invece di reperire lo script "activ", utilizzare direttamente l' pythoneseguibile nel bin/tuo virtualenv.

Se guardi il documento di utilizzo di virtualenv , noterai che dice:

ENV/binviene creato, dove vivono gli eseguibili, in particolare un nuovo pitone . Quindi l'esecuzione di uno script con #! /path/to/ENV/bin/pythoneseguirà quello script con questo pitone di virtualenv.

In altre parole, supponendo che crossbarsia lo script Python che si desidera eseguire che richiede venv-apvirtualenv, iniziare semplicemente crossbarcon:

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

E utilizzerà automaticamente virtualenv ogni volta che viene invocato.

Inoltre, è possibile richiamare direttamente l'interprete Python da virtualenv, con:

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

(Inoltre, per quanto riguarda l'esecuzione in una directory specifica, l'impostazione WorkingDirectory=/home/debian/apè migliore dell'uso di acd comando. Non è necessaria una shell in questo modo e systemd può fare una migliore gestione degli errori per te.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.