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

12

Eu tenho um serviço (escrito por mim mesmo) em execução em um servidor Debian (Jessie), e os próprios logs do serviço indicam que ele foi reiniciado em um determinado momento. Não há indicação de um segfault ou outra falha, então agora estou tentando descobrir se o aplicativo falhou silenciosamente e foi reaparecido pelo systemd, ou se um usuário reiniciou o serviço propositadamente systemctl.

O histórico do shell não mostra essa atividade, mas isso não é conclusivo por causa export HISTCONTROL=ignorebothe porque uma sessão SSH pode ter acabado o tempo limite, impedindo que o histórico do bash de um logon anterior seja gravado no disco. O servidor não foi reinicializado no momento.

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

Algumas outras postagens (por exemplo, Onde é / por que não há log para serviços normais do sistema do usuário? ) Parecem indicar que deve haver mensagens de log como esta:

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 systemd foram iniciados, parados ou reiniciados?

Editar : parece que o problema típico que as pessoas podem enfrentar é o fato de executarem journalctlcomo um usuário não privilegiado. Este não é o meu caso, estou operando rooto tempo todo. Em resposta a um comentário, a execução grep systemd /var/log/syslogme dá 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.
mindriot
fonte
"não vê essas mensagens de log" - estranho? Eu tenho um monte degrep systemd /var/log/syslog
hschou
No meu sistema eu só vejo mensagens muito genéricas, como Stopped target Default, Starting Shutdownetc. Nada indica nada sobre serviços individuais. Talvez seja apenas um problema de configuração? Note que estou no Debian Jessie neste caso em particular.
mindriot
Verifique se você /etc/systemd/journald.confnão substituiu MaxLevelStoreou MaxLevelSyslog, e procure em todos os outros lugares em que você pode configurar o diário conforme listado em man journald.conf.
Meu
Obrigado pela dica. Infelizmente, todos os arquivos de configuração localizados unter /etc/systemdestão essencialmente vazios (todas as opções comentadas, incluindo as mencionadas).
mindriot

Respostas:

11

Se você precisar criar um script para isso, consulte o systemctl show comando É mais útil para scripts do que tentar analisar qualquer coisa 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ê deseja ver todas as propriedades disponíveis, basta omitir a sinalização e ela será descartada.

$ systemctl show <service_name>

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

jdf
fonte
Interessante, eu não estava ciente das propriedades. Infelizmente, eles são definidos da mesma forma, independentemente de o serviço falhar e reaparecer, ou o serviço foi propositadamente reiniciado por um usuário.
mindriot
1
A propósito, um link melhor para as propriedades parece ser a documentação do dbus .
mindriot
Obrigado @mindriot, que é um link melhor para documentos, atualizei minha resposta.
jdf
1
@mindriot sobre o seu primeiro ponto, porém, você tem verificado StatusErrnoe Result? Gostaria de saber se isso muda se o serviço falhou ou foi reiniciado. Se você realmente precisar ir além, tente adicionar uma ExecStopPostetapa em que você toca em um arquivo e atualiza um carimbo de data / hora no desligamento. Isso ajudará você a diferenciar entre reinicializações silenciosas e propositais.
jdf
Obrigado, esse também é um bom argumento. Não poderei verificar / reproduzir a situação facilmente; minha postagem original já tem quase meio ano e, desde então, tivemos algumas alterações no sistema. Vou verificar se posso experimentá-lo em algum lugar - se tiver uma chance.
mindriot
3

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

$ journalctl 
No journal files were found.

o que é um pouco confuso.

Se você está logado como root, journalctl --unit=yourservicedeve fornecer as informações que você está procurando. Depois de um systemctl restart bind9no meu servidor, recebo isso depois 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=bind9dá:

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.

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

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

Pode ser útil saber que, por padrão, o systemd-journald armazena os logs em /run, o que é tmpfse, portanto, desaparece após uma reinicialização. Isso significa que, para obter as mensagens de log mais antigas que a última inicialização, você precisará examinar os arquivos syslog. Nesse caso, o journalctl não fornecerá logs mais antigos que a última inicialização. Isso pode ser alterado /etc/systemd/journald.confpela configuração 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 .servicearquivo. 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.
Tom Bjerck
fonte
Obrigado pela postagem extensa e bem escrita que provavelmente resolve o problema para a maioria dos usuários. Infelizmente, no meu caso, não vejo nenhuma linha de log atribuída ao systemdemitir o diário como você descreveu, mesmo que eu tenha trabalhado como raiz o tempo todo. /var/log/syslogtambém não mostra nada. A propósito, este é o sistema 215.
mindriot
3

Você pode ver a última vez que seu serviço foi iniciado ou reiniciado. Use service chatty statusou systemctl status chatty. Aqui estão exemplos para o serviço apache2 ou httpd:

# 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 Wen. 2017-06-02 15:53:01 CEST; 21min agomostra desde como o serviço está sendo executado, mas não sei se você pode exibir como uma 'lista' exatamente o que está procurando.

# systemctl status httpd

● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2019-10-11 00:35:58 EEST; 1 weeks 3 days ago
     Docs: man:httpd(8)
           man:apachectl(8)
  Process: 29728 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS)
 Main PID: 10722 (httpd)
   Status: "Total requests: 0; Current requests/sec: 0; Current traffic:   0 B/sec"
   Memory: 8.7M
klaypez
fonte
1
serviceé um comando Upstart antigo que funciona com o systemd para compatibilidade. O nativo de systemdcomando é systemctl status apache2.
MarkSosberg
Obrigado. Infelizmente, ele mostra apenas quando o serviço foi (re) iniciado, mas não por que ; e também mostra apenas a situação atual , ou seja, o último reinício.
mindriot