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=ignoreboth
e 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 journalctl
como um usuário não privilegiado. Este não é o meu caso, estou operando root
o tempo todo. Em resposta a um comentário, a execução grep systemd /var/log/syslog
me 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.
fonte
grep systemd /var/log/syslog
Stopped target Default
,Starting Shutdown
etc. 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./etc/systemd/journald.conf
não substituiuMaxLevelStore
ouMaxLevelSyslog
, e procure em todos os outros lugares em que você pode configurar o diário conforme listado emman journald.conf
./etc/systemd
estão essencialmente vazios (todas as opções comentadas, incluindo as mencionadas).Respostas:
Se você precisar criar um script para isso, consulte o
systemctl show
comando É mais útil para scripts do que tentar analisar qualquer coisastatus
. Por exemplo, para descobrir quando o serviço foi iniciado pela última vez, você pode usar:Se você deseja ver todas as propriedades disponíveis, basta omitir a sinalização e ela será descartada.
A documentação para essas propriedades pode ser encontrada aqui .
fonte
StatusErrno
eResult
? Gostaria de saber se isso muda se o serviço falhou ou foi reiniciado. Se você realmente precisar ir além, tente adicionar umaExecStopPost
etapa 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.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:
o que é um pouco confuso.
Se você está logado como root,
journalctl --unit=yourservice
deve fornecer as informações que você está procurando. Depois de umsystemctl restart bind9
no meu servidor, recebo isso depoisjournalctl --unit=bind9
:Se eu matar bind9 explicitamente com
kill -9
,journalctl --unit=bind9
dá: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.conf
e/etc/systemd/journald.conf
.Pode ser útil saber que, por padrão, o systemd-journald armazena os logs em
/run
, o que étmpfs
e, 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.conf
pela configuraçãoStorage=persistent
.As páginas de manual que documentam isso são:
Observe também que, para que um serviço seja reiniciado automaticamente pelo systemd, isso deve ser configurado em seu
.service
arquivo. Deman 5 systemd.service
:fonte
systemd
emitir o diário como você descreveu, mesmo que eu tenha trabalhado como raiz o tempo todo./var/log/syslog
também não mostra nada. A propósito, este é o sistema 215.Você pode ver a última vez que seu serviço foi iniciado ou reiniciado. Use
service chatty status
ousystemctl status chatty
. Aqui estão exemplos para o serviço apache2 ou httpd:a linha
Active: active (running) since Wen. 2017-06-02 15:53:01 CEST; 21min ago
mostra desde como o serviço está sendo executado, mas não sei se você pode exibir como uma 'lista' exatamente o que está procurando.fonte
service
é um comando Upstart antigo que funciona com o systemd para compatibilidade. O nativo desystemd
comando ésystemctl status apache2
.Podemos usar a
-f
opção para filtrar as mensagens do diário ( https://www.freedesktop.org/software/systemd/man/systemd.journal-fields.html ).fonte