Pregunta: Desde el comando uptime, sé cuántos días y horas el sistema está en funcionamiento. ¿Hay una manera fácil de ver la fecha y la hora exactas en que se reinició el sistema por última vez? es decir, ¿exactamente desde qué fecha y hora ha estado funcionando el sistema?
Respuesta: El tiempo de actividad proporciona esta información indirectamente. En el siguiente ejemplo, indica que el sistema ha estado funcionando durante “137 días, 6 horas y 13 minutos”. Pero no puede calcular rápidamente la fecha y hora exactas de reinicio a partir de esto.
$ uptime 20:52:01 up 137 days, 6:13, 1 user, load average: 0.00, 0.00, 0.00
En lugar de decir que el sistema ha estado funcionando durante los últimos "137 días, 6 horas y 13 minutos", no estaría bien si dijera que el sistema ha estado funcionando desde el "sábado 14 de mayo a las 20:38" (o algo así como que)? Eso es exactamente lo que hace cualquiera de los siguientes tres métodos.
1. Último comando
Use el comando 'último reinicio', que mostrará todas las fechas y horas de reinicio anteriores para el sistema. Esto selecciona la información del archivo /var/log/wtmp.
$ last reboot reboot system boot 2.6.32-100.28.5. Sat May 14 20:38 - 23:55 (137+06:16) reboot system boot 2.6.32-100.28.5. Sun Apr 24 21:28 - 23:37 (15+09:08) wtmp begins Thu Sun 24 17:28:47 2011
2. Quién manda
Use el comando 'who -b' que muestra la fecha y la hora del último reinicio del sistema.
$ who -b system boot 2011-05-14 20:38
3. Use el fragmento de código perl
Si insiste en usar la salida de tiempo de actividad para calcular el último tiempo de reinicio, puede hacerlo manualmente o usar el siguiente fragmento de código perl.
uptime | \ perl -ne '/.*up +(?:(\d+) days?,? +)?(\d+):(\d+),.*/; $total=((($1*24+$2)*60+$3)*60); $now=time(); $now-=$total; $now=localtime($now); print $now,"\n";'
En este ejemplo, el fragmento de código anterior mostró el siguiente resultado:
Sat May 14 20:38:39 2011
No recuerdo exactamente de dónde obtuve el fragmento de código perl anterior. Pero eso no me impidió tratar de averiguar qué hace. Aprovechemos esta oportunidad para aprender un poco de perl. Esto es lo que hace el fragmento de código perl anterior:
- -n es la opción de línea de comandos de Perl. Hace que el programa perl realice un bucle sobre la entrada
- -e es la opción de línea de comandos de Perl. Indica que se trata de una sola línea de perl (es decir, perl no esperará un nombre de archivo, algo así como "perl filename.pl").
Los siguientes son los Regex utilizados y sus explicaciones:
- .*up +:haga coincidir cualquier cosa hasta la cadena "up" y uno o más espacios, para hacer coincidir lo siguiente de la salida de tiempo de actividad.
- (?:(\d+) días?,? +) – Grupo único
- (?:(\d+) días?,? +)? – El signo de interrogación seguido de este grupo dice que este grupo es opcional
Esta parte dice, si hay una parte de días en la salida del tiempo de actividad, captúrela o ignórela. A continuación se desglosa el grupo anterior en detalle.
- (?:patrón) – Paréntesis sin captura que se usa para agrupar, pero no captura la coincidencia con la memoria que es $1, $2, etc.
- (\d+) – Haga coincidir uno o más dígitos y colóquelos en $1 (porque este es el primer grupo)
- Días ESPACIALES? – Haga coincidir el espacio literal seguido del día o días
- ,? – la coma es opcional
- ESPACIO+:uno o más espacios
Lo siguiente desglosa este patrón (\d+):(\d+),.*/
- (\d+) – Captura la parte de la hora en $2
- :– Seguido de dos puntos
- (\d+) – Captura la parte del minuto en $3
- , – Coincidir con coma
- .* – Coincide con todo lo demás
A continuación se muestra el resto de la función de tiempo en el fragmento de código perl anterior.
- $total=((($1*24+$2)*60+$3)*60) – Calcula la cantidad total de segundos que el sistema está ACTIVADO. es decir (((días*24+horas)*60+minutos)*60 que da los segundos (como un cálculo de época)
- $ahora=hora(); – Obtenga la hora actual en segundos (tiempo de época)
- $ahora-=$total; – Reste el tiempo total de funcionamiento del sistema de la hora actual. Esto es obtener la hora exacta en segundos cuando se inició el sistema
- $ahora=horalocal($ahora); – Convertir el tiempo de la época (tiempo en segundos). localtime devuelve el tiempo de época dado en formato legible por humanos
- imprimir $ahora,”\n” – Finalmente, esto imprime la hora.