Cómo ejecutar un comando dentro de un virtualenv usando systemd

15

Creo que esto debería ser simple, pero no puedo hacer que funcione correctamente.

Estos son los comandos que puedo ejecutar en la línea de comandos:

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

Estos comandos tienen que hacerse en este orden. Debido a virtualenv, el no ejecutable para crossbar y el script de python separado después, no he podido encontrar la mejor manera de hacer que esto funcione. Mi trabajo actual en progreso:

[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
fuente
1
¿Podrías resolverlo todavía? ¿Si es así, cómo?
negro

Respuestas:

11

Esto no funciona porque sourcees un comando shell, por lo que de systemd ExecStart=o ExecStartPre=no entenderán directamente ... (Por cierto, lo mismo es cierto para cdy el &&.)

Usted podría lograr que mediante la ejecución de una concha de forma explícita y en funcionamiento todos sus comandos juntos allí:

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

Pero un mejor enfoque es, en lugar de buscar el script "activar", usar el pythonejecutable bin/directamente en su virtualenv.

Si observa el documento de uso de virtualenv , notará que dice:

ENV/binse crea, donde viven los ejecutables, notablemente una nueva python . Por lo tanto, ejecutar un script con #! /path/to/ENV/bin/pythonejecutaría ese script bajo esta python de virtualenv.

En otras palabras, suponiendo crossbarque el script de Python que desea ejecutar requiere el venv-apvirtualenv, simplemente comience crossbarcon:

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

Y utilizará automáticamente el virtualenv siempre que se invoque.

También es posible, invocando al intérprete de Python desde virtualenv directamente, con:

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

(Además, con respecto a la ejecución en un directorio específico, la configuración WorkingDirectory=/home/debian/apes mejor que usar un cdcomando. No necesita un shell de esa manera, y systemd puede hacer un mejor manejo de errores por usted).

filbranden
fuente