Tentando executar um script python como um serviço usando systemd

0

Acabei de receber um debisk 8 VPS e estou tentando executar um script python como um serviço, escrevi isso (o everithing foi feito via ssh logado como root):

[Unit]
Description=My Script Service
After=multi-user.target

[Service]
Type=idle
ExecStart=/usr/bin/python /web/cmcreader/test.py > /web/cmcreader/test.log 2>&1

[Install]
WantedBy=multi-user.target

Eu coloquei em /lib/systemd/system Eu então fiz isso:

chmod 644 /lib/systemd/system/cmcreader.service

Eu então tentei ativá-lo usando:

systemctl daemon-reload
systemctl enable cmcreader.service

no entanto, o último comando retorna ( enable ):

Failed to execute operation: Invalid argument

O que eu fiz de errado? Obrigado.

    
por sliders_alpha 11.05.2017 / 14:46

2 respostas

4

A partir de man systemd.directives você pode encontrar os documentos para qualquer diretiva systemd. Aqui você pode descobrir que ExecStart= está documentado em man systemd.service .

Os documentos dizem:

redirection using "<", "<<", ">", and ">>", pipes using "|", running programs in the background using "&", and other elements of shell syntax are not supported.

Eles também não são normalmente necessários. systemd já executa aplicativos em segundo plano por padrão, portanto, você não precisa de & . Ele também captura automaticamente a saída para STDOUT e STDERR e a registra para você, portanto, não é necessário redirecionar a saída para um arquivo de log.

Use apenas journalctl -u cmcreader para visualizar os registros do seu serviço ou journalctl para visualizar todos os registros.

Se você não tem certeza sobre a sintaxe de um arquivo systemd, você pode usar:

systemd-analyze verify ./path/to/your.service

Além disso, os arquivos de serviço que você cria estão em /etc/systemd/system . O diretório /lib é para o arquivo de serviço instalado por pacotes, não por seres humanos.

Por fim, enable não inicia o serviço, apenas executa a seção [Install] , definindo o aplicativo para iniciar na inicialização.

Para iniciar o serviço, use systemctl start your.service .

    
por 11.05.2017 / 15:24
0

O problema é que você está tentando usar operadores de redirecionamento de shell - o systemd não executará implicitamente a linha ExecStart em um shell.

O que ele faz é executar o programa que você especificar ( /usr/bin/python em seu exemplo), com todo o resto sendo o argumento para o programa. Você recebe um erro de argumento inválido, porque a > /web/cmcreader/test.log 2>&1 part é um argumento inválido para python.

Embora eu certamente recomende que você simplesmente use journalctl como respondido por @ mark-stosberg e remova tudo do redirecionamento para frente, se você realmente quiser que seu script python grave um arquivo, algumas opções:

  • reescreva seu python para gravar no arquivo de log
  • ter o systemd executando um script bash que executa o script python e redireciona as saídas
  • ter systemd executar bash explicitamente a la ExecStart=bash -c "/usr/bin/python /web/cmcreader/test.py > /web/cmcreader/test.log 2>&1"

Novamente, eu realmente não recomendo essas opções - especialmente a última.

    
por 11.05.2017 / 15:43