Mon ordinateur dit:
$ uptime
10:20:35 up 1:46, 3 users, load average: 0,03, 0,10, 0,13
Et si je vérifie last
je vois:
reboot system boot 3.19.0-51-generi Tue Apr 12 08:34 - 10:20 (01:45)
Et puis je vérifie:
$ ls -l /var/log/boot.log
-rw-r--r-- 1 root root 4734 Apr 12 08:34 boot.log
Ensuite, je vois dans /var/log/syslog
la première ligne d'aujourd'hui étant:
Apr 12 08:34:39 PC... rsyslogd: [Origin software="rsyslogd" swVersion="7.4.4" x-pid="820" x-info="http://www.rsyslog.com"] start
Tout semble donc converger en 8:34
étant le moment où ma machine a démarré.
Cependant, je me demande: quel est le temps exact que uptime
utilise? uptime
est-il un processus qui lance et vérifie un fichier ou est-ce quelque chose sur le matériel?
J'utilise Ubuntu 14.04.
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
Depuis la page de manuel 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).
Le système de fichiers proc contient un ensemble de pseudo-fichiers. Ce ne sont pas de vrais fichiers, ils ressemblent simplement à 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
À ligne 49 , vous voyez un appel de fonction:
proc_create("uptime", 0, NULL, &uptime_proc_fops);
Cela crée un entrée du système de fichiers proc appelé 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é, il s'agit simplement d'opérations read()
et open()
. Cependant, si vous retracez les fonctions, vous vous retrouverez ici , où le temps de disponibilité est calculé.
En interne, il existe une interruption temporisée qui met à jour périodiquement la disponibilité des systèmes (en plus des autres valeurs). L'intervalle, dans lequel la temporisation s'interrompt, est défini par la macro préprocesseur HZ
, dont la valeur exacte est définie dans le noyau fichier de configuration 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) peuvent être calculés en nombre (en secondes) depuis le dernier démarrage.
Pour répondre à votre question: À partir de quand le "temps de disponibilité" commence-t-il à compter?
Étant donné que la disponibilité est une valeur interne du noyau, qui revient à chaque cycle, elle commence à compter lorsque le noyau est initialisé. Autrement dit, lorsque le premier cycle est terminé. Avant même que quoi que ce soit soit monté, directement après que le chargeur de démarrage donne le contrôle à l'image du noyau.
Pour autant que je sache, uptime
utilise /proc/uptime
pour calculer la disponibilité du système. Vous pouvez le voir plus clairement dans le code source ptime.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 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 depuis.
*) uptime
est un lien vers le programme w
et a été introduit par BSD vers 1980.