Obtener fecha y hora de inicio del sistema en Linux

44

Sé que uptimeimprime el tiempo que una máquina ha estado en funcionamiento, pero ¿hay una manera más fácil (confiable) de obtener la fecha de inicio que la cuenta atrás de esta salida?

Intenté mirar alrededor /proc, pero no encontré nada relevante. También hay una línea como esta en mi dmesg:

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

Pero me pregunto si este método es independiente de la distribución y la versión del kernel.

jho
fuente
¿Qué es unreliable or hardacerca uptime?
Bobby
2
@Bobby: nada sobre el comando o su función per se, pero como dije quiero obtener la fecha y la hora del último arranque del sistema, no cuánto tiempo ha estado activo desde entonces. uptimedevuelve una cadena como "hasta 13 días, 21:01", y tendrá que contarlo a partir de eso.
jho
44
Es trivial contar desde el valor del tiempo de actividad. Si quieres confiable , quieres /proc/uptime.
sam hocevar

Respuestas:

40

Encontré algunos comandos aquí . Prueba who -bo last reboot | head -1.
whoda fechas numéricas, mientras que last rebootdevuelve nombres abreviados de día / mes.

puente de Charles
fuente
¿qué tal si solo queremos la fecha y nada más?
T0xicCode
44
who -b | cut -d' ' -f13fecha de devolución solamente (-f14 hora de devolución)
charlesbridge
2
Advertencia: last rebootno me dio la fecha correcta! who -bhizo.
qwertzguy
last reboottambién me dio una fecha incorrecta, wtmp parecía haber sido rotado el primer día del mes
golimar
23

Esto consulta el tiempo de actividad del núcleo y lo muestra en la zona horaria local:

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

Tenga cuidado con otras opciones. El lastcomando dejará de funcionar tan pronto como wtmpse haya girado. El whocomando depende de la disponibilidad e integridad de utmp. Y /proc/1podría tener la fecha actual en lugar de la fecha de inicio, e incluso podría no estar disponible en un sistema reforzado. Editar : dmesgsolo tiene un búfer de respaldo de longitud fija, por lo que también es irrealizable. Los registros del núcleo pueden estar en, /var/logpero la mayoría de las distribuciones solo conservan 8 semanas de ellos.

sam hocevar
fuente
1
Curiosamente, esto no está de acuerdo con who -buno o dos minutos en mi sistema de tiempo de actividad de 210 días. Parece que who -binforma una marca de tiempo, mientras que este conteo se ve afectado de alguna manera por las desviaciones del reloj, incluso si estos se corrigen periódicamente por una carrera ntpd.
Ruslan
3
Después de revisar todas las respuestas alternativas, date -d "`cut -f1 -d. /proc/uptime` seconds ago" -u
decidí
Respuesta fenomenal. Si el núcleo no lo sabe, nadie lo sabe, es la Fuente de la Verdad para el sistema. Los segundos facilitan la realización de cálculos de tiempo (me topé con esto porque quiero saber "¿Cuál de mis hosts no se reinició en el último día [86,400 segundos]?")
Mike S
17

Me topé con esta pregunta mientras buscaba una forma de obtener un tiempo de arranque consistente y analizable , en lugar del tiempo desde el arranque que cambia en cada llamada.

Parece que uptime -shará el truco en la mayoría de los sistemas Linux.

mikegreiling
fuente
uptime -ssalidas por ej 2017-08-09 01:23:45. Esto es lo mejor, al ser más simple. Este comando está incluido en el paquete "procps".
teika kazura
El uptimeen CentOS 6 ( procps version 3.2.8no parece) para apoyar esto, tristemente.
mwfearnley
uptime -sno siempre devuelve resultados constantes: superuser.com/q/1247713/71144
cweiske
1
Tenga en cuenta que esto siempre está en tiempo local , pero en realidad no imprime la zona horaria / desplazamiento. Por lo tanto, si está buscando sacar esto de las máquinas mediante programación, no es ideal, ya que es posible que necesite determinar por separado su zona horaria, dependiendo de su caso de uso. Por lo tanto, sugeriría algunas de las otras respuestas.
JJC
11

Encontré la btimelínea /proc/statcuando hurgaba un poco

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

y después de una búsqueda rápida, encontré esta página: / proc / stat explicada , que describe los "Varios datos sobre la actividad del núcleo que están disponibles en el /proc/statarchivo".

La línea "btime" indica el tiempo en que se inició el sistema, en segundos desde la época de Unix.

Oddstr13
fuente
1
Parece mucho más fácil de escribirawk '/btime/{print $2}' /proc/stat
William Pursell
@WilliamPursell más fácil es siempre lo que ya sabes. No soy un mago awk. : P
Oddstr13
Buen punto. Sin embargo, usaste cat gratuitamente. Solo grep del archivo.
Mike S
@MikeS correcto; sin embargo, sigo defendiendo mi cadena de comandos original como una representación clara de dónde se encuentra la información, incluso 7 años después de mi respuesta.
Oddstr13
8
  • buena : uptime -s, who -bo análisis/proc/uptime
  • malo : ls -ld /proc/1y variantes.

No use ls -ld / proc / 1 para este propósito. A veces se actualiza después de s2disk o s2ram.

En mi caso, who -bdijo:

arranque del sistema 2 de mayo 09:51

Mientras ls -ld /proc/1:

dr-xr-xr-x 7 root root 0 3 de mayo 13:09 / proc / 1

ls -ldpara /proco /sysparecen persistir después de la reanudación, pero es dependiente de la implementación, y puede cambiar en el futuro, así que no use estos métodos. Y si el reloj de su sistema está en hora local, no UTC , tienen un desplazamiento negativo.

(Todavía no tengo el privilegio de comentar las respuestas, así que abrí una nueva respuesta. Lo siento).

EDITAR: uptime -sfue respondido por primera vez en esta respuesta por mikegreiling

teika kazura
fuente
2

La forma más simple es mirar para ver cuándo / sbin / init comenzó (ese es siempre el primer proceso que se inicia después de que se carga el núcleo):

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

Así que puedo ver que mi máquina se inició a las 6 minutos hasta la medianoche del 27 de marzo de 2011.

Si desea usarlo en scripts, puede usar el statcomando en su lugar:

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

Los %YEspecifica el tiempo desde el directorio fue cambiado por última vez (tiempo de creación de procesos) en segundos desde la época (1/1/70) y es una marca de tiempo Unix.

Majenko
fuente
1
Desafortunadamente, esto no funciona: el mtime en esas carpetas puede cambiar por otras razones (tengo un sistema aquí que tiene un tiempo de actividad de 5 días y el mtime de / proc / 1 es hace 25 minutos)
kdt
1
No es confiable , como se explicó en mi respuesta
teika kazura
1

En Linux

ls -ld /proc

Parece que me da lo que necesito. La publicación anterior es extraña. /proc/uptimeno contiene un valor de fecha; debería sustraerse de la hora actual. Quizás quiso decir:

date -d @$(( $(date +%s) - $(cut -f1 -d. /proc/uptime) ))
Gerry
fuente
uptime -sproporciona un valor de fecha
mikegreiling el
1

Bajo Bash, sin tuberías ni otros procesos; Solo texto:

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

(Solo reutiliza la REPLYvariable predeterminada, pero puedes elegir lo que necesites)

Luchostein
fuente
¿Seguro Por qué no? Uso un poco inteligente de subcadena variable. Guay. +1. Gracias por la idea!
Mike S
1

Esto parece robusto y te lo dará en formato UTC e ISO8601. (Elimine las dos últimas opciones para deshabilitar, respectivamente):

date -d "`cut -f1 -d. /proc/uptime` seconds ago" -u -Iseconds
JJC
fuente
0
date -d @$(sed -n '/^btime /s///p' /proc/stat)

(Otra forma más de hacer esto, que es útil en ciertas circunstancias)

AmanicA
fuente
0

Mando:

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

Salida:

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

Claro y conciso con el 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
Rfraile
fuente