Sur mon système, il obtient la disponibilité 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
À partir de la page de manuel proc :
/proc/uptime This file contains two numbers: the uptime of the system (seconds), and the amount of time spent in idle process (seconds).
Le système de fichiers proc contient un ensemble de pseudo-fichiers. Ce ne sont pas de vrais fichiers, ils ressemblent juste à des fichiers, mais ils contiennent des valeurs fournies directement par le noyau. Chaque fois que vous lisez un fichier, tel que /proc/uptime
, son contenu est régénéré à la volée. Le système de fichiers proc est une interface avec le noyau.
Dans le code source du noyau Linux du fichier fs/proc/uptime.c
à la ligne 49, vous voyez un appel de fonction :
proc_create("uptime", 0, NULL, &uptime_proc_fops);
Cela crée une entrée de système de fichiers proc appelée uptime
(le procfs est généralement monté sous /proc
), et lui associe une fonction, qui définit les opérations de fichier valides sur ce pseudo-fichier et les fonctions qui leur sont associées. En cas de disponibilité, c'est juste read()
et open()
opérations. Cependant, si vous retracez les fonctions, vous vous retrouverez ici, où le temps de disponibilité est calculé.
En interne, il existe une minuterie d'interruption qui met à jour périodiquement la disponibilité des systèmes (en plus d'autres valeurs). L'intervalle, dans lequel l'interruption du temporisateur se déclenche, est défini par la macro du préprocesseur HZ
, dont la valeur exacte est définie dans le fichier de configuration du noyau et appliquée au moment de la compilation.
Le temps d'inactivité et le nombre de cycles CPU, combinés à la fréquence HZ
(cycles par seconde) peut être calculé en nombre (de secondes) depuis le dernier démarrage.
Pour répondre à votre question :À partir de quand le "temps de disponibilité" commence-t-il ?
Étant donné que le temps de disponibilité est une valeur interne du noyau, qui augmente à chaque cycle, il commence à compter lorsque le noyau s'est initialisé. C'est-à-dire lorsque le premier cycle est terminé. Même avant que quoi que ce soit ne soit monté, directement après que le chargeur de démarrage donne le contrôle à l'image du noyau.
Tant que je sais, uptime
utilise /proc/uptime
pour calculer la disponibilité du système. Vous pouvez le voir plus clairement dans le code source 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);
}
Sur un système UNIX standard (basé sur les sources d'origine *), uptime
lit /var/adm/utmpx
et vérifie la dernière heure d'entrée de redémarrage.
En d'autres termes :il s'agit de récupérer la date que vous obtenez également avec who -b
puis calcule le temps écoulé depuis.
*) uptime
est un lien vers le w
programme et a été introduit par BSD vers 1980.