O primeiro campo de /proc/uptime
é seu amigo para quando (vá lê-lo com cat /proc/uptime
). É uma contagem de segundos que o seu sistema está ativo. O segundo campo desse arquivo é quantos cpusegundos estiveram inativos em seu sistema (divida-o pelo número de CPUs listadas em /proc/cpuinfo
nesse sistema para obter segundos reais).
# if your awk is new enough, 1 second resolution.
awk '//{print strftime("%c",systime()-$1)}' /proc/uptime
# for older awk, but requires bc binary, high resolution
date -d @$(echo $(date +%s.%N) - $(awk '{print $1}' /proc/uptime) |bc )
# older awk, 1 second resolution, no bc
date -d @$(( $(date +%s) - $(awk '{printf "%d",$1}' /proc/uptime) ))
Imprime o tempo de inicialização do seu sistema dentro de um segundo. Eu digo dentro de 1 segundo, porque o é fracional, e o awk retorna somente systime
como um inteiro.
Isso não diz quem ou por que foi reiniciado. O melhor que você pode fazer para isso é a saída do comando last
, que registrará os desligamentos e reinicializações normais; bem como sessões perdidas como resultado de uma reinicialização difícil (por exemplo, power blip, bug do kernel). Eles não são confiáveis, pois dependem de ninguém adulterar os arquivos /var/log/wtmp*
.
Veja um exemplo de uma sessão perdida:
root@nms1:~# last -f /var/log/wtmp.1
root pts/0 10.x.y.z Mon Oct 27 05:41 gone - no logout
root pts/0 10.x.y.z Mon Oct 20 04:55 - 16:47 (11:51)
E aqui está um exemplo de reinicialização.
[root@freepbx ~]# last
...
reboot system boot 2.6.32-431.el6.x Mon Oct 20 13:46 - 16:13 (3+02:27)
root pts/2 10.x.y.z Wed Oct 15 21:02 - 00:51 (2+03:48)
root pts/1 10.x.y.z Wed Oct 15 14:17 - 00:51 (2+10:33)
sitkasta pts/0 10.x.y.z Tue Oct 14 20:23 - down (5+17:22)
root pts/0 10.x.y.z Tue Oct 14 10:43 - 20:22 (09:39)
Se você quiser algo mais, veja algo como a estrutura audit
e envie os comandos reboot / shutdown para um & confiável & proteger o destino de registro remoto.