Auf meinem System erhält es die Betriebszeit von /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
Aus der Proc-Manpage:
/proc/uptime This file contains two numbers: the uptime of the system (seconds), and the amount of time spent in idle process (seconds).
Das proc-Dateisystem enthält eine Reihe von Pseudodateien. Das sind keine echten Dateien, sie sehen nur wie Dateien aus, aber sie enthalten Werte, die direkt vom Kernel bereitgestellt werden. Jedes Mal, wenn Sie eine Datei lesen, z. B. /proc/uptime
, wird sein Inhalt im laufenden Betrieb regeneriert. Das proc-Dateisystem ist eine Schnittstelle zum Kernel.
Im Linux-Kernel-Quellcode der Datei fs/proc/uptime.c
In Zeile 49 sehen Sie einen Funktionsaufruf:
proc_create("uptime", 0, NULL, &uptime_proc_fops);
Dadurch wird ein proc-Dateisystemeintrag namens uptime
erstellt (Das procfs wird normalerweise unter /proc
gemountet ) und ordnet ihr eine Funktion zu, die gültige Dateioperationen für diese Pseudodatei und die damit verbundenen Funktionen definiert. Im Falle einer Betriebszeit sind es nur read()
und open()
Operationen. Wenn Sie jedoch die Funktionen zurückverfolgen, landen Sie hier, wo die Betriebszeit berechnet wird.
Intern gibt es einen Timer-Interrupt, der regelmäßig die Betriebszeit des Systems (neben anderen Werten) aktualisiert. Das Intervall, in dem der Timer-Interrupt tickt, wird durch das Präprozessor-Makro HZ
definiert , dessen genauer Wert in der Kernel-Konfigurationsdatei definiert ist und zur Kompilierzeit angewendet wird.
Die Leerlaufzeit und die Anzahl der CPU-Zyklen, kombiniert mit der Häufigkeit HZ
(Zyklen pro Sekunde) kann in einer Anzahl (Sekunden) seit dem letzten Start berechnet werden.
Um Ihre Frage zu beantworten:Ab wann wird die Betriebszeit gezählt?
Da die Betriebszeit ein Kernel-interner Wert ist, der jeden Zyklus ansteigt, beginnt sie zu zählen, wenn der Kernel initialisiert wurde. Das heißt, wenn der erste Zyklus beendet ist. Noch bevor irgendetwas gemountet wird, direkt nachdem der Bootloader die Kontrolle an das Kernel-Image übergeben hat.
Soweit ich weiß, uptime
verwendet /proc/uptime
um die Systemverfügbarkeit zu berechnen. Sie können es deutlicher im Quellcode 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);
}
Auf einem Standard-UNIX-System (basierend auf den Originalquellen *), uptime
lautet /var/adm/utmpx
und sucht nach dem letzten Zeitpunkt des Neustarteintrags.
Mit anderen Worten:Dies ist das Abrufen des Datums, das Sie auch mit who -b
erhalten und berechnet dann die Zeit seitdem.
*) uptime
ist ein Link zum w
Programm und wurde um 1980 von BSD eingeführt.