En mi sistema obtiene el tiempo de actividad de /proc/uptime
:
$ strace -eopen uptime
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib/libproc-3.2.8.so", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/proc/version", O_RDONLY) = 3
open("/sys/devices/system/cpu/online", O_RDONLY|O_CLOEXEC) = 3
open("/etc/localtime", O_RDONLY|O_CLOEXEC) = 3
open("/proc/uptime", O_RDONLY) = 3
open("/var/run/utmp", O_RDONLY|O_CLOEXEC) = 4
open("/proc/loadavg", O_RDONLY) = 4
10:52:38 up 3 days, 23:38, 4 users, load average: 0.00, 0.02, 0.05
Desde la página de manual de proc:
/proc/uptime This file contains two numbers: the uptime of the system (seconds), and the amount of time spent in idle process (seconds).
El sistema de archivos proc contiene un conjunto de pseudo archivos. Esos no son archivos reales, solo parecen archivos, pero contienen valores proporcionados directamente por el núcleo. Cada vez que lee un archivo, como /proc/uptime
, su contenido se regenera sobre la marcha. El sistema de archivos proc es una interfaz para el kernel.
En el código fuente del kernel de Linux del archivo fs/proc/uptime.c
en la línea 49, verá una llamada de función:
proc_create("uptime", 0, NULL, &uptime_proc_fops);
Esto crea una entrada en el sistema de archivos proc llamada uptime
(el procfs generalmente se monta bajo /proc
), y le asocia una función, que define las operaciones de archivo válidas en ese pseudoarchivo y las funciones asociadas a ellas. En caso de tiempo de actividad, es solo read()
y open()
operaciones. Sin embargo, si rastrea las funciones, terminará aquí, donde se calcula el tiempo de actividad.
Internamente, hay una interrupción del temporizador que actualiza periódicamente el tiempo de actividad del sistema (además de otros valores). El intervalo, en el que la interrupción del temporizador marca, está definido por el preprocesador-macro HZ
, cuyo valor exacto se define en el archivo de configuración del kernel y se aplica en el momento de la compilación.
El tiempo de inactividad y el número de ciclos de CPU, combinados con la frecuencia HZ
(ciclos por segundo) se puede calcular en un número (de segundos) desde el último arranque.
Para responder a su pregunta:¿Desde cuándo comienza a contar el "tiempo de actividad"?
Dado que el tiempo de actividad es un valor interno del kernel, que marca cada ciclo, comienza a contar cuando el kernel se ha inicializado. Es decir, cuando ha finalizado el primer ciclo. Incluso antes de que se monte nada, directamente después de que el cargador de arranque le dé control a la imagen del kernel.
Hasta donde yo sé, uptime
usa /proc/uptime
para calcular el tiempo de actividad del sistema. Puede verlo más claramente en el código fuente uptime.c
FILE *fp;
fp = fopen ("/proc/uptime", "r");
if (fp != NULL)
{
char buf[BUFSIZ];
char *b = fgets (buf, BUFSIZ, fp);
if (b == buf)
{
char *end_ptr;
double upsecs = c_strtod (buf, &end_ptr);
if (buf != end_ptr)
uptime = (0 <= upsecs && upsecs < TYPE_MAXIMUM (time_t)
? upsecs : -1);
}
fclose (fp);
}
En un sistema UNIX estándar (basado en las fuentes originales *), uptime
lee /var/adm/utmpx
y comprueba la última vez que se reinicia la entrada.
En otras palabras:esto es recuperar la fecha que también obtienes con who -b
y luego calcula el tiempo transcurrido desde entonces.
*) uptime
es un enlace al w
programa y fue presentado por BSD alrededor de 1980.