Como vejo quando um serviço do systemd foi iniciado / interrompido / reiniciado?

8

Eu tenho um serviço (escrito por mim) rodando em um servidor Debian (Jessie), e os próprios logs do serviço acontecem para indicar que ele foi reiniciado em um determinado momento. Não há nenhuma indicação de um segfault ou outro travamento, então agora estou tentando descobrir se o aplicativo de alguma forma silenciosamente falhou e foi recuperado pelo systemd, ou se um usuário propositadamente reiniciou o serviço via systemctl .

O histórico do shell não mostra tal atividade, mas isso não é conclusivo por causa de export HISTCONTROL=ignoreboth e porque uma sessão SSH pode ter acabado de expirar, evitando que o histórico bash do login anterior seja gravado no disco. O servidor não foi reinicializado no momento.

Mas eu esperaria que o próprio systemd devesse manter um log indicando quando um serviço foi propositadamente reiniciado. Para minha surpresa, não consegui encontrar nenhuma documentação (por exemplo, sobre journalctl ) sobre como obter esses registros.

Algumas outras postagens (por exemplo, Onde está / por que não há log para serviços normais do sistema do usuário? ) parecem indicar que deveria haver mensagens de log assim:

Jan 15 19:28:08 qbd-x230-suse.site systemd[1]: Starting chatty.service...
Jan 15 19:28:08 qbd-x230-suse.site systemd[1]: Started chatty.service.

Mas não vejo essas mensagens de log no meu sistema.

Existe uma maneira de descobrir quando os serviços do systemd foram iniciados, parados ou reiniciados?

Editar : parece que o problema típico que as pessoas enfrentam é que elas executam journalctl como um usuário não privilegiado. Este não é o caso para mim, eu tenho operado como root o tempo todo. Em resposta a um comentário, a execução de grep systemd /var/log/syslog me fornece apenas isso:

Jun  6 09:28:35 server systemd[22057]: Starting Paths.
Jun  6 09:28:35 server systemd[22057]: Reached target Paths.
Jun  6 09:28:35 server systemd[22057]: Starting Timers.
Jun  6 09:28:35 server systemd[22057]: Reached target Timers.
Jun  6 09:28:35 server systemd[22057]: Starting Sockets.
Jun  6 09:28:35 server systemd[22057]: Reached target Sockets.
Jun  6 09:28:35 server systemd[22057]: Starting Basic System.
Jun  6 09:28:35 server systemd[22057]: Reached target Basic System.
Jun  6 09:28:35 server systemd[22057]: Starting Default.
Jun  6 09:28:35 server systemd[22057]: Reached target Default.
Jun  6 09:28:35 server systemd[22057]: Startup finished in 59ms.
Jun  6 09:37:08 server systemd[1]: Reexecuting.
    
por mindriot 02.06.2017 / 12:08

3 respostas

5

Se você precisar fazer script disso, você deve procurar usar o systemctl show comando. É mais útil para scripts do que tentar analisar qualquer coisa de status . Por exemplo, para descobrir quando o serviço foi iniciado pela última vez, você pode usar:

$ systemctl show systemd-journald --property=ActiveEnterTimestamp
ActiveEnterTimestamp=Wed 2017-11-08 05:55:17 UTC

Se você quiser ver todas as propriedades disponíveis, omita o sinalizador e as despejará todas.

$ systemctl show <service_name>

A documentação para estas propriedades pode ser encontrada aqui .

    
por 09.11.2017 / 20:35
3

Com a configuração padrão no Debian, um usuário sem privilégios não terá acesso ao log do systemd-journald, nem ao log do syslog. Se logado como usuário normal, você receberá esta resposta do journalctl:

$ journalctl 
No journal files were found.

que é um pouco confuso.

Se você estiver logado como root, journalctl --unit=yourservice deve fornecer as informações que você está procurando. Depois de um systemctl restart bind9 no meu servidor, recebo isso depois de journalctl --unit=bind9 :

Jun 03 18:20:24 ns systemd[1]: Stopping BIND Domain Name Server...
Jun 03 18:20:24 ns named[27605]: received control channel command 'stop'
Jun 03 18:20:24 ns systemd[1]: Starting BIND Domain Name Server...
Jun 03 18:20:24 ns systemd[1]: Started BIND Domain Name Server.

Se eu matar bind9 explicitamente com kill -9 , journalctl --unit=bind9 dará:

Jun 03 18:46:25 ns systemd[1]: bind9.service: main process exited, code=killed, status=9/KILL
Jun 03 18:46:25 ns rndc[28028]: rndc: connect failed: 127.0.0.1#953: connection refused
Jun 03 18:46:25 ns systemd[1]: bind9.service: control process exited, code=exited status=1
Jun 03 18:46:25 ns systemd[1]: Unit bind9.service entered failed state.
Jun 03 18:46:25 ns systemd[1]: bind9.service holdoff time over, scheduling restart.
Jun 03 18:46:25 ns systemd[1]: Stopping BIND Domain Name Server...
Jun 03 18:46:25 ns systemd[1]: Starting BIND Domain Name Server...
Jun 03 18:46:25 ns systemd[1]: Started BIND Domain Name Server.

A primeira linha indica que o processo morreu porque foi morto.

systemd-journald também encaminha todas as mensagens de log para o syslog, então você também deve encontrar essas mensagens em /var/log/syslog .

O Systemd e o systemd-journald têm um padrão compilado na configuração que pode ser alterado em /etc/systemd/system.conf e /etc/systemd/journald.conf .

Pode ser útil saber que, por padrão, o systemd-journald armazena os logs em /run , que é tmpfs e, portanto, desaparece após a reinicialização. Isso significa que, para obter mensagens de log mais antigas que a última inicialização, você terá que examinar os arquivos syslog. Neste caso, o journalctl não lhe dará logs mais antigos que a última inicialização. Isso pode ser alterado em /etc/systemd/journald.conf , definindo Storage=persistent .

As páginas de manual que documentam isso são:

man 8 systemd-journald
man 5 journald.conf
man 5 systemd-system.conf
man 5 systemd-user.conf

Observe também que, para que um serviço seja reiniciado automaticamente pelo systemd, isso deve ser configurado em seu arquivo .service . De man 5 systemd.service :

   Restart=
       Configures whether the service shall be
       restarted when the service process exits, is
       killed, or a timeout is reached. The service
       process may be the main service process, but it
       may also be one of the processes specified with
       ExecStartPre=, ExecStartPost=, ExecStop=,
       ExecStopPost=, or ExecReload=. When the death
       of the process is a result of systemd operation
       (e.g. service stop or restart), the service
       will not be restarted. Timeouts include missing
       the watchdog "keep-alive ping" deadline and a
       service start, reload, and stop operation
       timeouts.

       Takes one of no, on-success, on-failure,
       on-abnormal, on-watchdog, on-abort, or always.
       If set to no (the default), the service will
       not be restarted.
    
por 03.06.2017 / 20:31
1

Você pode ver a última vez que seu serviço foi iniciado ou reiniciado, use service chatty status , aqui um exemplo para o serviço apache2:

# service apache2 status
● apache2.service - LSB: Apache2 web server
   Loaded: loaded (/etc/init.d/apache2)
  Drop-In: /lib/systemd/system/apache2.service.d
       └─forking.conf
   Active: active (running) since ven. 2017-06-02 15:53:01 CEST; 21min ago
  Process: 14773 ExecStop=/etc/init.d/apache2 stop (code=exited, status=0/SUCCESS)
  Process: 22912 ExecReload=/etc/init.d/apache2 reload (code=exited, status=0/SUCCESS)
  Process: 14880 ExecStart=/etc/init.d/apache2 start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/apache2.service

a linha Active: active (running) since ven. 2017-06-02 15:53:01 CEST; 21min ago mostra como o serviço está rodando, mas eu não sei se você pode exibir uma 'lista' exatamente do que você está procurando

    
por 02.06.2017 / 16:16