Aqui está um script de teste que usei:
last_reboot=$(last reboot | grep 'still running' | awk '{for (i=5; i<=NF; i++) printf $i FS}' | awk '{for (i=1; i<=NF - 2; i++) printf $i FS}')
if [ "$last_reboot" ]; then
date -d "$last_reboot" '+last reboot: %Y-%m-%d'
fi
days=$(uptime | awk '{print $3}')
hours=$(uptime | awk '{print $5}' | sed -E 's/,$//')
h=$(echo "$hours" | cut -d: -f 1)
m=$(echo "$hours" | cut -d: -f 2)
date -d "- $days days - $h hours - $m minutes" '+uptime: %Y-%m-%d'
who -b | awk '{print "who: " $3}'
journalctl --list-boots | awk '$1 == "0" {print "journalctl: " $4}'
Localmente, todas as quatro datas coincidem.
Eu executei em cerca de 10 servidores. last reboot
não relata nada (provavelmente, porque wtmp
é girado por logrotate
). uptime
e who -b
combinar. E journalctl
não. O que exatamente journalctl --list-boots
relata? Por que não pode corresponder ao relatório de outras ferramentas?
Os novos logs binários nos sistemas operacionais Linux não funcionam da mesma forma que os antigos logs binários.
Os logs binários antigos eram
/var/log/wtmp
e/var/log/btmp
. Na inicialização do sistema, uma entrada seria gravadawtmp
com o nome de usuárioreboot
e, no desligamento, uma entrada seria gravadawtmp
com o nome de usuárioshutdown
. Encontrar os horários em que o sistema foi reinicializado foi uma questão de usar os comandoslast reboot
elast shutdown
para imprimir essas entradas.Os novos logs binários são o diário do systemd e não possuem essas entradas.
Em vez disso, cada registro de diário possui um campo denominado boot ID . Você pode ver isso com a
-o verbose
opção dejournalctl
. Um ID de inicialização é gerado pelo kernel no bootstrap esystemd-journald
aplica o ID de inicialização atual, obtido do kernel, a cada registro de log à medida que o adiciona ao diário.Para implementar a
list-boots
funcionalidade,journalctl
verifica todo o diário , lendo os carimbos de data/hora e IDs de inicialização de cada registro e anotando os carimbos de data/hora mais antigos e mais recentes associados a cada ID de inicialização exclusivo.Portanto, se partes do diário forem limpas ou, inversamente, permanecerem por muito tempo, os tempos aparentes de inicialização e desligamento relatados por
journalctl
serão muito diferentes dos tempos reais de inicialização e desligamento./run/utmp
é uma tabela de registros de login do terminal, com entradas especiais para inicialização e desligamento. Essas entradas são lidas poruptime
ewho -b
. Eles são escritos por programas comosystemd-update-utmp
, um análogo doutx
comando FreeBSD, que são executados como parte dos procedimentos de inicialização e desligamento. Eles não são executados em primeiro ou último lugar, pois os serviços relevantes não são (e de fato não podem ser) solicitados absolutamente em primeiro ou último lugar. Pode haver entradas de diário com o ID de inicialização relevante que precedem a hora dasystemd-update-utmp reboot
execução e entradas de diário semelhantes quesystemd-update-utmp shutdown
são posteriores à hora da execução.Leitura adicional