如何可靠地获取系统启动的时间戳?

如何可靠地获取系统启动的时间戳?

我知道该uptime命令,但它返回自启动以来的秒数,因此,如果我只是从当前时间戳中减去该数字,理论上,如果在读取正常运行时间和当前时间戳后秒数发生变化,我可以得到不同的结果。uptime -s是我想要的,但它在centos上不可用(顺便说一句,它是如何计算的?)。我可以只获取 /proc 目录的 ctime 吗?这似乎给了我正确的数字,但我想知道是否每个 Linux 系统都在启动时创建了 /proc。

答案1

首先,crtime在 Linux 上很棘手。也就是说,运行类似的东西

$ stat -c %z /proc/ 
2014-10-30 14:00:03.012000000 +0100

或者

$ stat -c %Z /proc/ 
1414674003

可能正是您所需要的。文件系统/proc是由 LFS 标准定义的,并且应该适用于任何 Linux 系统以及对于大多数(全部?)UNIXen。

或者,假设您实际上并不需要秒精度,而只需要正确的时间戳,您可以使用who

$ who -b
   system boot  2014-10-30 14:00

From man who: -b, --boot 上次系统启动的时间

您可以使用 GNU 将其转换为自纪元以来的秒数date

$ date -d "$(who -b | awk '{print $4,$3}' | tr - / )" +%s
1414674000

答案2

另一种解决方案是/proc/stat[ btime1]:

$ cat /proc/stat | grep btime | awk '{print $2}'

输出示例:

1583547431

这是自纪元以来的秒数时间戳。

[1]http://man7.org/linux/man-pages/man5/proc.5.html

答案3

在 macOS 上,/proc不可用,但/dev可以。以下是一些其他选项:

$ who -b
reboot   ~        Dec 17 18:45
$ stat -f %m /dev
1608227137

其中-f %m指定以“strftime(3) 格式”显示上次修改时间。

$ stat -F /dev   
dr-xr-xr-x 3 root wheel 4606 Dec 17 18:45:37 2020 /dev/

如果安装了 GNU 工具(通过 Homebrew),这些工具也可用:

$ gwho -b
         system boot  2020-12-17 18:45
$ gstat -c %Y /dev
1608227137

其中-c %Y指定显示“上次数据修改的时间,自纪元以来的秒数”。

$ gstat -c %y /dev
2020-12-17 18:45:37.000000000 +0100

%y相反,人类可读。

答案4

上述解决方案仅适用于具有 RTC 的计算机。在 Raspberry Pi 和其他没有 RTC 的嵌入式系统上,系统在创建系统目录结构时会将参考时间戳设置为 0。由于我们在这里讨论的是 Linux,因此请从 /proc/uptime 读取信息

cat /proc/uptime | awk '{ print $1 }'

相关内容