Systemd: Como iniciar / parar o script Python que deve ser executado em segundo plano, dentro do Virtualenv

2

Na minha máquina Raspbian, quero uma conexão bem-sucedida do OpenVPN com meu provedor de VPN para iniciar um script Python, que deve ser executado persistentemente em segundo plano enquanto a conexão VPN estiver ativa. Se / quando a conexão VPN ficar offline, eu gostaria de finalizar o script Python.

Meu raciocínio é o seguinte: os flags up e down no arquivo de configuração do OpenVPN executarão scripts de shell que iniciam e interrompem um systemd service. Esse serviço Requires the openvpn.service e não pode ( não deve ) ser executado sem ele .

O que está complicando as coisas é que eu quero rodar o script Python dentro de um Virtualenv , que no bash é acessível por alias coding="cd /home/p1/Coding/Python/Virtual/py279/bin; source activate; cd /home/p1/Coding/Python/Projects" . A localização do arquivo Python está na última pasta.

No entanto, entendo que systemd não pode executar linhas de comando da mesma maneira que o alias coding acima.

Então eu acho que uma solução poderia ser para systemd executar um .service que executa um script .sh que por sua vez executa o script .py Python.

Esquemático:

OpenVPN upovpn_up.shsudo systemctl start vpn_up.serviceExecStart=/path/to/start_pythonscript.shcoding; python my_script.py

OpenVPN downovpn_down.shsudo systemctl stop vpn_up.service

Minha suposição é que existem algumas ressalvas e / ou problemas com isso, especialmente em relação à maneira correta de terminar o script Python.

Perguntas:

  • Isso é viável?
  • Quais seções e comandos de serviço nos arquivos de serviço são necessários para que isso funcione?
  • Existem considerações especiais que devem ser feitas para essa disposição geral, por exemplo, limpeza adequada após terminar o script Python, o que acontece no desligamento / reinicialização do sistema, etc?
por Winterflags 21.04.2016 / 21:38

1 resposta

2

Você deve primeiro simplificar seu alias, não há necessidade de fazer o material de ativação. O que é importante é a primeira linha, shebang, do script python. Deveria ler:

 #!/path/to/your/virtualenv/bin/python

Se o script for executável ( chmod +x script_name ), a linha acima se certificará de que o python instalado no virtualenv seja chamado, e isso garante que os pacotes instalados no virtualenv sejam executados.

Você pode criar um alias para o script ou colocar o script em algum diretório que esteja em seu PATH.

No arquivo de serviço do systemd você deve usar o caminho completo para o script. Tal script poderia parecer:

[Unit]
Description=your program description
Requires=any services that need to be installed
After=run after this service

[Service]
Restart=always
ExecStart=/root/bin/application start
ExecStop=/root/bin/application stop

[Install]
WantedBy=multi-user.target

O texto acima assume que seu script python está em /root/bin/application e que ele é iniciado se passado no argumento start da linha de comando e quando chamado com stop , de alguma forma a segunda invocação sabe como notificar o start ed aplicativo e graciosamente desligado. Se você não tiver um ExecStop systemd tentará parar / matar seu aplicativo, o que você pode pegar com um manipulador de sinal

    
por 22.04.2016 / 08:28