Eu acredito que isso deve ser simples, mas não consigo fazê-lo funcionar 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
Esses comandos precisam ser executados nessa ordem. Devido ao virtualenv, o não executável para barra cruzada e o script python separado posteriormente, não consegui descobrir a melhor maneira de fazer isso funcionar. Meu trabalho atual em andamento:
[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
fonte
fonte
Respostas:
Isso não funciona porque
source
é um comando do shell, então o systemdExecStart=
ouExecStartPre=
não os entenderá diretamente ... (BTW, o mesmo vale paracd
e&&
.)Você pode conseguir isso executando um shell explicitamente e executando todos os seus comandos juntos:
Mas uma abordagem melhor é, em vez de buscar o script "ativar", usar o
python
executávelbin/
diretamente no seu virtualenv.Se você olhar para o documento de uso do virtualenv , verá que ele diz:
Em outras palavras, supondo que
crossbar
seja o script Python que você deseja executar que requer ovenv-ap
virtualenv, basta começarcrossbar
com:E ele usará automaticamente o virtualenv sempre que for chamado.
Também é possível invocar o interpretador Python diretamente do virtualenv, com:
(Além disso, em relação executado em um diretório específico, definição
WorkingDirectory=/home/debian/ap
é melhor do que usar umcd
comando. Você não precisa de um shell dessa maneira, e systemd pode fazer melhor manuseio para você erro.)fonte