V mém systému získává dostupnost od /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
Z manuálové stránky proc:
/proc/uptime This file contains two numbers: the uptime of the system (seconds), and the amount of time spent in idle process (seconds).
Souborový systém proc obsahuje sadu pseudo souborů. Nejsou to skutečné soubory, jen vypadají jako soubory, ale obsahují hodnoty, které poskytuje přímo jádro. Při každém čtení souboru, například /proc/uptime
, jeho obsah se regeneruje za pochodu. Souborový systém proc je rozhraním k jádru.
Ve zdrojovém kódu linuxového jádra souboru fs/proc/uptime.c
na řádku 49 vidíte volání funkce:
proc_create("uptime", 0, NULL, &uptime_proc_fops);
Tím se vytvoří záznam systému souborů proc s názvem uptime
(procfs je obvykle připojen pod /proc
) a přidruží k němu funkci, která definuje platné operace se soubory s tímto pseudosouborem a funkcemi s nimi spojenými. V případě provozuschopnosti je to jen read()
a open()
operace. Pokud však zpětně vysledujete funkce, skončíte zde, kde se počítá doba provozu.
Interně existuje časovač-přerušení, které periodicky aktualizuje dobu provozu systému (kromě jiných hodnot). Interval, ve kterém tiká přerušení časovače, je definován makrem preprocesoru HZ
, jehož přesná hodnota je definována v konfiguračním souboru jádra a použita při kompilaci.
Doba nečinnosti a počet cyklů CPU v kombinaci s frekvencí HZ
(cyklů za sekundu) lze vypočítat v počtu (sekundách) od posledního spuštění.
Odpověď na vaši otázku:Od kdy se doba provozuschopnosti začíná počítat?
Vzhledem k tomu, že doba provozuschopnosti je interní hodnotou jádra, která se zvyšuje v každém cyklu, začne se počítat, když se jádro inicializuje. Tedy až skončí první cyklus. Ještě předtím, než je cokoli připojeno, přímo poté, co zavaděč předá kontrolu obrazu jádra.
Pokud vím, uptime
používá /proc/uptime
pro výpočet doby provozu systému. Jasněji to můžete vidět ve zdrojovém kódu 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);
}
Na standardním systému UNIX (na základě původních zdrojů *), uptime
čte /var/adm/utmpx
a zkontroluje poslední čas restartu.
Jinými slovy:toto je načtení data, které také získáte pomocí who -b
a poté vypočítá čas od té doby.
*) uptime
je odkaz na w
program a byl představen BSD kolem roku 1980.