我的电脑说:
$ uptime
10:20:35 up 1:46, 3 users, load average: 0,03, 0,10, 0,13
如果我检查last
我会看到:
reboot system boot 3.19.0-51-generi Tue Apr 12 08:34 - 10:20 (01:45)
然后我检查:
$ ls -l /var/log/boot.log
-rw-r--r-- 1 root root 4734 Apr 12 08:34 boot.log
然后我在/var/log/syslog
今天的第一行看到:
Apr 12 08:34:39 PC... rsyslogd: [origin software="rsyslogd" swVersion="7.4.4" x-pid="820" x-info="http://www.rsyslog.com"] start
所以一切似乎都集中在8:34
我的机器启动的时间上。
不过,我想知道:具体的时间是uptime
用什么时间呢?是uptime
启动并检查某些文件的进程还是硬件上的某些东西?
我运行的是 Ubuntu 14.04。
答案1
在我的系统上,它的正常运行时间来自/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
来自过程手册页:
/proc/uptime This file contains two numbers: the uptime of the system (seconds), and the amount of time spent in idle process (seconds).
proc 文件系统包含一组伪文件。这些不是真正的文件,它们只是看起来像文件,但它们包含由内核直接提供的值。每次您读取文件(例如 )时/proc/uptime
,其内容都会即时重新生成。 proc 文件系统是内核的接口。
在linux内核源代码中该文件fs/proc/uptime.c
位于49号线,您会看到一个函数调用:
proc_create("uptime", 0, NULL, &uptime_proc_fops);
这创建了一个proc 文件系统条目调用uptime
(procfs 通常安装在 下/proc
),并将一个函数与其关联,该函数定义对该伪文件的有效文件操作以及与它们关联的函数。在正常运行时间的情况下,它只是read()
和open()
操作。然而,如果你追溯这些函数,你最终会得到这里,其中计算正常运行时间。
在内部,有一个定时器中断,它定期更新系统正常运行时间(除了其他值之外)。定时器中断计时的时间间隔由预处理器宏定义HZ
,其确切值在内核中定义配置文件并在编译时应用。
空闲时间和 CPU 周期数与频率HZ
(每秒周期数)相结合,可以计算出自上次启动以来的秒数。
解决你的问题:“正常运行时间”从什么时候开始计算?
由于正常运行时间是内核内部值,每个周期都会增加,因此它在内核初始化时开始计数。也就是说,当第一个周期结束时。即使在安装任何东西之前,在引导加载程序将控制权交给内核映像之后。
答案2
据我所知,uptime
用于/proc/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);
}
答案3
在标准 UNIX 系统上(基于原始源*), uptime
读取/var/adm/utmpx
并检查上次重新启动条目的时间。
换句话说:这是检索您也获得的日期who -b
,然后计算从那时起的时间。
*)uptime
是该程序的链接w
,由 BSD 于 1980 年左右引入。