Monitorando os tempos de ativação do serviço do systemd

1

Gostaria de poder recuperar do systemd quanto tempo a última ativação de um oneshot service levou. Pensei nas opções a seguir, mas elas não conseguiram me convencer completamente:

  1. Compute InactiveEnterTimestamp - InactiveExitTimestamp , por ex. lendo-os através da interface D-Bus em Python. Isso tem a desvantagem de ser inconsistente (= negativo) enquanto o serviço está em execução.

  2. Use scripts auxiliares em ExecStartPre e ExecStartPost para armazenar um registro de data e hora e calcular o tempo decorrido depois que o serviço sair.

  3. Use um script wrapper em torno do executável do serviço que armazena o tempo decorrido em algum lugar no sistema de arquivos quando o executável principal é encerrado.

  4. Use um script auxiliar em ExecStartPost que armazena o valor computado em # 1.

Minha preferência vai para # 4 se possível, então # 3 se não. O que você sugeriria? Existe uma maneira melhor de fazer isso?

Contexto: Estou executando o Tiny Tiny RSS , que tem um script de atualizador de feed que executo em intervalos regulares usando um systemd cronômetro. Também corro o Isync da mesma forma para fazer backup do conteúdo da minha caixa de entrada do Gmail. Meu objetivo final é ser capaz de monitorar quanto tempo cada ativação de serviço leva, e ser alertado se demorar muito ou não for executado por um longo tempo.

EDIT: Meu arquivo de serviço é assim:

[Unit]
Description=Tiny Tiny RSS feeds update
After=network.target mysqld.service postgresql.service

[Service]
Type=oneshot
ExecStart=/usr/bin/php /usr/share/webapps/tt-rss/update.php --feeds
User=ttrss
StandardOutput=syslog
StandardError=syslog

E este é o cronômetro:

[Unit]
Description=Tiny Tiny RSS feeds update timer

[Timer]
OnBootSec=1s
OnUnitInactiveSec=120s
Persistent=true
Unit=tt-rss.service

[Install]
WantedBy=timers.target
    
por F.X. 07.10.2015 / 01:01

1 resposta

2

Compute InactiveEnterTimestamp - InactiveExitTimestamp

O tempo de ativação (em segundos) é o resultado de:

(ActiveEnterTimestampMonotonic - InactiveExitTimestampMonotonic) / 1e6

Veja a função analyze_plot no arquivo analyze.c para detalhes.

Mas você deve ter RemainAfterExit=yes em sua unidade para obter ActiveEnterTimestampMonotonic .

Você pode calcular ExecMainExitTimestampMonotonic - ExecMainStartTimestampMonotonic no PostStartExec sem RemainAfterExit .

e.g. by reading them through the D-Bus interface in Python.

Você pode usar systemctl para extrair esses valores:

$ systemctl show -p InactiveExitTimestampMonotonic -p ActiveEnterTimestampMonotonic unit
InactiveExitTimestampMonotonic=44364325621
ActiveEnterTimestampMonotonic=44369331083

De acordo com a Promessa de estabilidade da interface :

The stable interfaces are:

...

The command line interface of systemctl, loginctl, journalctl.
We will make sure that scripts invoking these commands will continue
to work with future versions of systemd. Note however that the output
generated by these commands is generally not included in the promise,
unless it is documented in the man page. Example: the output of
"systemctl status" is not stable, but the one of "systemctl show" is,
because the former is intended to be human readable and the latter
computer readable, and this is documented in the man page.

My end goal is to be able to monitor how much time each service activation takes, and be alerted if it takes too long

Você pode definir TimeoutStartSec e OnFailure :

TimeoutStartSec= 

Configures the time to wait for start-up. If a daemon service does
not signal start-up completion within the configured time, the
service will be considered failed and will be shut down again.

OnFailure=

A space-separated list of one or more units that are activated when
this unit enters the "failed" state.

or hasn't run for a long time

Você pode extrair o último tempo de sucesso do diário:

 journalctl -u your-service MESSAGE='Started your-service.service.'

Mas você deve ativar o armazenamento persistente de mensagens de log.

    
por 07.10.2015 / 04:45