systemd: Por que este serviço está inativo (morto)?

2

Estou apenas tentando daemonizar este script python simples:

#!/usr/bin/python3
print('hello')

Aqui estão meus comandos e o status:

root@gw-0317STLG0067 /lib/systemd/system # systemctl enable test.service
root@gw-0317STLG0067 /lib/systemd/system # systemctl daemon-reload
root@gw-0317STLG0067 /lib/systemd/system # systemctl start test.service
root@gw-0317STLG0067 /lib/systemd/system # systemctl status test.service
* test.service - My Script Service
   Loaded: loaded (/usr/lib/systemd/system/test.service; enabled; vendor preset:
   Active: inactive (dead) since Sun 2016-07-31 10:06:29 UTC; 4s ago
  Process: 20620 ExecStart=/root/test.py (code=exited, status=0/SUCCESS)
 Main PID: 20620 (code=exited, status=0/SUCCESS)

Jul 31 10:06:29 gw-0317STLG0067 systemd[1]: Started My Script Service.
Jul 31 10:06:29 gw-0317STLG0067 test.py[20620]: hello

E aqui meu script de serviço:

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

[Service]
Type=simple
ExecStart = /root/test.py

[Install]
WantedBy=multi-user.target

Por que ele está morto e também o que exatamente deve acontecer quando você daemoniza uma declaração impressa? Deve explodir o terminal?

    
por Goldname 07.07.2017 / 18:55

3 respostas

2

Está morto porque o script atinge seu ponto final e termina. Por que uma única instrução print explodiria o terminal? Um daemon geralmente é executado em um loop que verifica se ele está encerrando o tempo e termina em caso afirmativo (ou se ele captura um sinal do kernel).

    
por 07.07.2017 / 19:09
4

Seu script normalmente é iniciado como serviço, termina bem rápido (já que há apenas um comando e nenhum laço while ou similar nele reexecutando) e assim o serviço terminou mais rapidamente, então você pode perguntar pelo seu status. Tente adicionar um loop (com tempo limite para não enviar spam aos seus registros) para poder vê-lo ativo:

while True:
    print('hello')
    time.sleep(2)

e mate-o através do systemctl assim que você tiver visto (com journalctl -u test.service ) o suficiente.

    
por 07.07.2017 / 19:15
0

Seu script python imprime 'hello world', então o python percebe que chegou ao fim do seu script e finaliza a execução.

O que você deseja que o systemd faça?

experimente um script sh simples como este:

#!/bin/sh touch /tmp/myfile$$.txt echo /tmp/myfile$$.txt tail -f /tmp/myfile$$.txt

Você recebe o nome <file> no status do serviço.

Em seguida, no seu terminal, apenas envie um texto para ele: echo "Hello World" >> <file> e inspecione o serviço.

Um serviço que faz loops e imprime repetidamente irá encher o seu terminal .... aqui, você lê um arquivo e está livre para fornecer algum texto quando quiser. Cada serviço start cria um novo arquivo, $$ é o PID, em seguida, como exercício, apague o arquivo /tmp/myfile$$.txt quando você parar o serviço; -)

Palavra-chave para o exercício: trap é um caminho; -)

Mantenha as coisas simples, aprenda e adicione a elas. Observe que o python também pode reagir aos sinais. Eu escolhi sh porque é mais fácil ... para começar ...

    
por 07.07.2017 / 19:33