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
systemd
python
python3
virtualenv
sscirrus
fuente
fuente
Respuestas:
Esto no funciona porque
source
es un comando shell, por lo que de systemdExecStart=
oExecStartPre=
no entenderán directamente ... (Por cierto, lo mismo es cierto paracd
y 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í:
Pero un mejor enfoque es, en lugar de buscar el script "activar", usar el
python
ejecutablebin/
directamente en su virtualenv.Si observa el documento de uso de virtualenv , notará que dice:
En otras palabras, suponiendo
crossbar
que el script de Python que desea ejecutar requiere elvenv-ap
virtualenv, simplemente comiencecrossbar
con:Y utilizará automáticamente el virtualenv siempre que se invoque.
También es posible, invocando al intérprete de Python desde virtualenv directamente, con:
(Además, con respecto a la ejecución en un directorio específico, la configuración
WorkingDirectory=/home/debian/ap
es mejor que usar uncd
comando. No necesita un shell de esa manera, y systemd puede hacer un mejor manejo de errores por usted).fuente