Como manter o script python em execução como um serviço systemd?

0

Eu tenho um script python com uma função que desejo executar a cada x minutos. Eu faço isso com

from threading import Timer

x = 5

def control():
    Timer(x*60, control).start()
    rest_of_the_function()
control{)

Quando executo o script em seu ambiente virtual python a partir do terminal, não há problema, no entanto, quando o executo como serviço systemd, ele chama a função control apenas uma vez e depois não faz nada.

Se eu verificar o serviço através do campo systemctl status myservice its Active diz active (running) e não houver erros no log.

O arquivo /lib/systemd/system/myservice.service tem esta aparência:

[Unit]
Description=Short description

[Service]
Type=simple
WorkingDirectory=/home/user/myservice
ExecStart=/home/user/myservice/myvenv/bin/python main.py

[Install]
WantedBy=multi-user.target

Por que só chama a função control uma vez? Pode ser consertado?

    
por VaNa 01.10.2017 / 17:57

2 respostas

3

Acho que você provavelmente está enfrentando um problema de buffer simples. Se você estiver procurando por mensagens no stdout, que por padrão é o diário das unidades do systemd, talvez seja necessário esperar muito tempo para que dados suficientes sejam impressos antes de serem eliminados.

Um teste simples para isso é adicionar a opção -u ao python para tornar a saída sem buffer. Lembre-se de fazer systemctl daemon-reload depois de editar o arquivo da unidade de serviço.

Você também pode usar strace para anexar ao processo python em execução. Você presumivelmente vai encontrá-lo esperando em um usuário futex, mas depois do tempo apropriado você deve ver o retorno da chamada futex, e depois entrar novamente.

    
por 01.10.2017 / 19:49
1

Ao usar print() ou qualquer outra coisa que grava em um descritor de arquivo (arquivo, canal, etc), você precisará liberar os buffers com flush() se precisar da saída imediatamente.

Alternativamente para stdin , stdout e stderr você pode usar o modo unbuffered usando a opção -u para python descrita no página de manual .

    
por 01.10.2017 / 19:52