Como executar um comando dentro de um virtualenv usando o systemd

7

Acredito que isso seja simples, mas não consigo que funcione corretamente.

Estes são os comandos que eu posso executar na linha de 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

Estes comandos têm que ser feitos nesta ordem. Devido ao virtualenv, o non-executable para crossbar, e o script python separado depois, eu não consegui descobrir a melhor maneira de fazer isso funcionar. Meu trabalho em andamento atual:

[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
    
por sscirrus 08.12.2017 / 00:38

1 resposta

1

Isso não funciona porque source é um comando de shell, então ExecStart= ou ExecStartPre= do systemd não os entenderá diretamente ... (BTW, o mesmo vale para cd e o && .)

Você poderia alcançar isso executando um shell explicitamente e executando todos os seus comandos juntos:

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

Mas uma abordagem melhor é, em vez de pesquisar o script "activate", usar o executável python no bin/ de seu virtualenv diretamente.

Se você olhar para o documento de uso do virtualenv, verá que ele diz:

ENV/bin is created, where executables live - noticeably a new python. Thus running a script with #! /path/to/ENV/bin/python would run that script under this virtualenv’s python.

Em outras palavras, assumindo que crossbar é o script Python que você deseja executar que requer o venv-ap virtualenv, simplesmente inicie crossbar com:

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

E ele usará automaticamente o virtualenv sempre que for chamado.

Também é possível invocar o interpretador Python do virtualenv diretamente, com:

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

(Além disso, com relação à execução em um diretório específico, definir WorkingDirectory=/home/debian/ap é melhor do que usar o comando cd . Você não precisa de um shell dessa maneira e o systemd pode fazer melhor tratamento de erros para você.)

    
por 26.07.2018 / 07:57

Tags