Obtendo data e hora da inicialização do sistema no Linux


44

Sei que uptimeimprime o tempo em que uma máquina está em funcionamento, mas existe uma maneira mais fácil (confiável) de obter a data de início do que a contagem regressiva dessa saída?

Tentei olhar em volta /proc, mas não encontrei nada relevante. Há também uma linha como esta no meu dmesg:

[    0.673492] rtc_cmos rtc_cmos: setting system clock to 2011-03-14 14:26:52 UTC (1300112812)

Mas eu estou querendo saber se este método é independente da distribuição e da versão do kernel?


O que é unreliable or hardsobre uptime?
Bobby

2
@ Bobby: Nada sobre o comando ou sua função em si, mas como disse, quero obter a data e a hora da última inicialização do sistema, não quanto tempo faz desde então. uptimeretorna uma sequência como "até 13 dias, 21:01" e você precisa contar a partir disso.
jho

4
É trivial contar novamente com o valor de tempo de atividade. Se você quer confiança , você quer /proc/uptime.
28611 sam hocevar

Respostas:


40

Encontrei alguns comandos aqui . Tente who -bou last reboot | head -1.
whofornece datas numéricas, enquanto last rebootretorna nomes abreviados de dia / mês.


Que tal se queremos apenas a data e nada mais?
T0xicCode 8/12/12

4
who -b | cut -d' ' -f13Retorna a data única (-f14 retornos tempo)
Charlesbridge

2
Aviso: last rebootnão me deu a data correta! who -bfez.
Qwertzguy

last rebootme deu uma data incorreta também, wtmp parecia ter sido girado primeiro dia do mês
Golimar

23

Isso consulta o tempo de atividade do kernel e o exibe no fuso horário local:

date -d "`cut -f1 -d. /proc/uptime` seconds ago"

Tenha cuidado com outras opções. O lastcomando irá parar de funcionar assim que wtmpfor girado. O whocomando depende da disponibilidade e integridade de utmp. E /proc/1pode ter a data atual em vez da data da hora de inicialização e pode até estar indisponível em um sistema reforçado. Edit : dmesgpossui apenas um buffer traseiro de comprimento fixo, por isso também é irrealizável. Os logs do kernel podem estar, /var/logmas a maioria das distribuições mantém apenas 8 semanas deles.


1
Curiosamente, isso discorda who -bde um ou dois minutos no meu sistema de 210 dias de atividade. Parece que who -brelata um carimbo de data / hora, enquanto essa contagem é de alguma forma afetada pelos desvios do relógio, mesmo que sejam periodicamente corrigidos por uma corrida ntpd.
Ruslan

3
Depois de analisar todas as respostas alternativas, liquidados em: date -d "`cut -f1 -d. /proc/uptime` seconds ago" -u(que tem data / hora em UTC)
david6

Resposta fenomenal. Se o kernel não sabe, ninguém sabe - é a Fonte da Verdade para o sistema. Os segundos se torna mais fácil para executar cálculos de tempo (eu tropecei sobre isso porque eu quero saber "Qual dos meus anfitriões não reiniciar no último dia [86.400 segundos]?")
Mike S

17

Eu me deparei com essa questão enquanto procurava uma maneira de obter um tempo de inicialização consistente e analisável , em vez do tempo desde a inicialização, que muda a cada chamada.

Parece que uptime -sfará o truque na maioria dos sistemas Linux.


uptime -ssaídas por exemplo 2017-08-09 01:23:45. Isso é melhor, sendo mais simples. Este comando está incluído no pacote "procps".
Teika kazura

O uptimeno CentOS 6 ( procps version 3.2.8) não parece apoiar esta, infelizmente.
Mkfearnley #

uptime -snem sempre retorna resultados constantes: superuser.com/q/1247713/71144
cweiske 18/01

1
Note que este está sempre em localtime , mas que na verdade não imprimir o fuso horário / offset. Portanto, se você deseja obter isso de máquinas programaticamente, não é o ideal, pois pode ser necessário determinar separadamente o fuso horário, dependendo do seu caso de uso. Então, sugiro algumas das outras respostas.
JJC

11

Eu encontrei a btimelinha /proc/statquando bisbilhotando um pouco

cat /proc/stat | grep btime | awk '{ print $2 }'

e após uma pesquisa rápida, encontrei esta página: / proc / stat explicada , que descreve as "Várias informações sobre a atividade do kernel disponíveis no /proc/statarquivo".

A linha "btime" indica o tempo em que o sistema inicializou, em segundos desde a época do Unix.


1
Parece muito mais fácil de escreverawk '/btime/{print $2}' /proc/stat
William Pursell

@WilliamPursell mais fácil é sempre o que você já sabe. Eu não sou um bruxo estranho. : P
Oddstr13

Bom ponto. No entanto, você usou gato gratuitamente. Apenas grep do arquivo.
Mike S

O @MikeS está correto - no entanto, ainda mantenho minha cadeia de comando original como uma representação clara de onde as informações são encontradas, mesmo 7 anos após a minha resposta.
Oddstr13

8
  • boa : uptime -s, who -bou análise/proc/uptime
  • ruim : ls -ld /proc/1e variantes.

Não use ls -ld / proc / 1 para esse fim. Às vezes, é atualizado após s2disk ou s2ram.

No meu caso, who -bdisse:

inicialização do sistema 2 de maio 09:51

Enquanto ls -ld /proc/1:

dr-xr-xr-x 7 raiz raiz 0 3 de maio 13:09 / proc / 1

ls -ldpara /procou /sysparece persistir após a retomada, mas depende da implementação e pode mudar no futuro, portanto, não use esses métodos. E se o relógio do sistema estiver no horário local , não no UTC , eles terão um deslocamento negativo.

(Ainda não tenho o privilégio de comentar as respostas, abri uma nova resposta. Desculpe.)

EDIT: uptime -sfoi respondido pela primeira vez nesta resposta por mikegreiling


2

A maneira mais simples é ver quando o / sbin / init foi iniciado (esse é sempre o primeiro processo a ser iniciado após o carregamento do kernel):

# ls -ld /proc/1
dr-xr-xr-x 7 root root 0 2011-03-27 23:54 /proc/1

Para que eu possa ver que minha máquina foi inicializada às 6 minutos da meia-noite de 27 de março de 2011.

Se você quiser usá-lo em scripts, poderá usar o statcomando:

# stat --printf='%Y' /proc/1
1301266491

Os %Yespecifica o tempo desde que o diretório foi modificado pela última vez (hora de criação do processo) em segundos desde a época (1/1/70) e é um timestamp unix padrão.


1
Infelizmente, isso não funciona: o mtime nessas pastas pode mudar por outros motivos (eu tenho um sistema aqui que tem um uptime 5 dias eo mtime de / proc / 1 está 25 minutos atrás)
kdt

1
É não confiável , como explicado na minha resposta
Teika Kazura

1

No Linux,

ls -ld /proc

parece me dar o que eu preciso. A postagem acima é ímpar. /proc/uptimenão contém um valor de data - teria que ser subtraído da hora atual. Talvez ele quis dizer:

date -d @$(( $(date +%s) - $(cut -f1 -d. /proc/uptime) ))

uptime -sfornece um valor de data
mikegreiling

1

Sob Bash, sem tubos ou outros processos; apenas texto:

$ REPLY="$(</proc/uptime)"
$ REPLY="${REPLY%%.*}"
$ echo "$REPLY"
31207

(Apenas reutilizei a REPLYvariável padrão, mas você pode escolher o que precisar)


Claro, por que não? Uso inteligente de substringiness variável. Legal. +1. Obrigado pela ideia!
Mike S

1

Isso parece robusto e fornecerá a você no formato UTC e ISO8601. (Remova as duas últimas opções para desativar, respectivamente):

date -d "`cut -f1 -d. /proc/uptime` seconds ago" -u -Iseconds

0
date -d @$(sed -n '/^btime /s///p' /proc/stat)

(mais uma maneira de fazer isso, que é útil em determinadas circunstâncias)


0

Comando:

(echo ' Currently:' | tr "\n" ' ' ; date +"%Y-%m-%d %k:%M:%S" ; echo '  Up Since:' | tr '\n' ' ' ; uptime -s ; echo '  Duration:' | tr '\n' ' ' ; uptime -p)

Resultado:

 Currently: 2016-05-09  9:06:29
  Up Since: 2016-05-04 12:56:04
  Duration: up 4 days, 20 hours, 10 minutes

0

Clara e concisa com o comando tuptime :

# tuptime -t
No.             Startup Date                                          Uptime            Shutdown Date   End                    Downtime

1     09:43:39 AM 08/08/2017      41 days, 0 hours, 51 minutes and 2 seconds   10:34:41 AM 09/18/2017    OK                  10 seconds
2     10:34:51 AM 09/18/2017                         1 minute and 16 seconds   10:36:07 AM 09/18/2017    OK                    1 second
3     10:36:08 AM 09/18/2017                       13 minutes and 20 seconds   10:49:28 AM 09/18/2017    OK                   3 seconds
4     10:49:31 AM 09/18/2017       45 days, 0 hours, 1 minute and 20 seconds   09:50:51 AM 11/02/2017    OK                   4 seconds
5     09:50:55 AM 11/02/2017                       27 minutes and 25 seconds   10:18:20 AM 11/02/2017    OK                   4 seconds
6     10:18:24 AM 11/02/2017                                       9 seconds   10:18:33 AM 11/02/2017    OK                   9 seconds
7     10:18:42 AM 11/02/2017      4 days, 5 hours, 41 minutes and 47 seconds   04:00:29 PM 11/06/2017    OK                  44 seconds
8     04:01:13 PM 11/06/2017    15 days, 17 hours, 33 minutes and 48 seconds   09:35:01 AM 11/22/2017   BAD   10 minutes and 40 seconds
9     09:45:41 AM 11/22/2017               8 hours, 9 minutes and 20 seconds   05:55:01 PM 11/22/2017   BAD     7 minutes and 8 seconds
10    06:02:09 PM 11/22/2017                1 hour, 7 minutes and 54 seconds   07:10:03 PM 11/22/2017   BAD   11 minutes and 30 seconds
11    07:21:33 PM 11/22/2017               1 hour, 58 minutes and 32 seconds   09:20:05 PM 11/22/2017    OK                   5 seconds
12    09:20:10 PM 11/22/2017                       14 minutes and 52 seconds   09:35:02 PM 11/22/2017   BAD    5 minutes and 52 seconds
13    09:40:54 PM 11/22/2017                         4 minutes and 6 seconds   09:45:00 PM 11/22/2017   BAD    4 minutes and 51 seconds
14    09:49:51 PM 11/22/2017             11 hours, 15 minutes and 10 seconds   09:05:01 AM 11/23/2017   BAD    7 minutes and 20 seconds
15    09:12:21 AM 11/23/2017      3 days, 2 hours, 17 minutes and 40 seconds   11:30:01 AM 11/26/2017   BAD   27 minutes and 44 seconds
16    11:57:45 AM 11/26/2017   109 days, 19 hours, 12 minutes and 37 seconds   07:10:22 AM 03/16/2018    OK                  17 seconds
17    07:10:39 AM 03/16/2018     25 days, 3 hours, 55 minutes and 59 seconds   12:06:38 PM 04/10/2018    OK                   3 seconds
18    12:06:41 PM 04/10/2018      8 days, 19 hours, 3 minutes and 20 seconds   07:10:01 AM 04/19/2018   BAD    3 minutes and 52 seconds
19    07:13:53 AM 04/19/2018     77 days, 9 hours, 44 minutes and 39 seconds
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.