你的系统正常运行时间是多少?

使用 tuptime 工具跟踪您的系统的正常运行时间和停机时间。

如果“开始”指的是上次启动,那么查找系统的正常运行时间很容易;历史命令 uptime 会报告该信息。但是,如果“开始”指的是系统的首次启动呢?或者最近 365 天?或者上个月?

有没有办法获得累积的正常运行时间——或者更好的是,查看系统的整个生命周期?例如,汽车有里程表,您可以查看自第一天以来的英里/公里数。对于计算机,开发了一个专门用于此任务的工具:tuptime

tuptime 报告您系统的历史和统计运行时间和停止时间,跟踪重启之间的时间。其主要目标是

  • 计数系统启动次数。
  • 注册首次启动时间(自安装以来)。
  • 计数计划内和意外关机。
  • 显示自首次启动时间以来的正常运行时间和停机时间百分比。
  • 显示累积的系统正常运行时间、停机时间和总时间。
  • 显示最长、最短和平均正常运行时间和停机时间。
  • 显示当前正常运行时间。
  • 打印包含大多数先前值的格式化表格或列表。
  • 注册使用的内核。
  • 创建自给定启动或时间戳起和/或直至给定启动或时间戳的报告。
  • 以 CSV 格式创建报告。

它的工作原理非常简单。tuptime 在启动和关机时由 init 管理器执行,然后在 cron 任务中启动定期执行——无需担心任何守护进程。在内部,它查看 btime 值(在 /proc/stat 中可用)和 uptime 值(来自 /proc/uptime),基本上就是这样。

在 Debian、Ubuntu 和衍生发行版中,使用它们各自的包管理器,安装过程非常简单,并且应该在所有官方存储库中都可用。作为先决条件,它需要 Python 3 和 SQLite 库,它们通常默认包含在核心包中。

一旦它在您的系统上可用,您就可以获取信息。它有三种输出格式:默认格式是摘要,还有表格和列表输出,用于打印注册的行为。

""

图 1. 安装后 tuptime 执行示例

首次执行报告自系统启动以来的时间,并且这些行是不言自明的(请注意,日期格式基于系统的区域设置)


$ tuptime
System startups:    1   since   22:21:49 02/02/18
System shutdowns:   0 ok   -   0 bad
System uptime:      100.0 %   -   40 minutes and 22 seconds
System downtime:    0.0 %   -   0 seconds
System life:        40 minutes and 22 seconds


Largest uptime:     40 minutes and 22 seconds   from
 ↪22:21:49 02/02/18
Shortest uptime:    40 minutes and 22 seconds   from
 ↪22:21:49 02/02/18
Average uptime:     40 minutes and 22 seconds


Largest downtime:    0 seconds
Shortest downtime:   0 seconds
Average downtime:    0 seconds


Current uptime:  40 minutes and 22 seconds   since
 ↪22:21:49 02/02/18

当从较旧的系统获取此报告时(见下文),信息变得更加有趣。除了计数增加之外,还有更多关于行为的事实。例如,“系统关机”行有 11 个“错误”,这反映出关机过程未正确执行,可能是由于电源故障或系统挂起。正常运行时间和停机时间的百分比反映了此报告来自一个轻度使用的系统


$ tuptime
System startups:    688   since   22:21:49 09/10/15
System shutdowns:   676 ok   <-   11 bad
System uptime:      4.6 %   -   40 days, 7 hours, 7 minutes
 ↪and 48 seconds
System downtime:    95.4 %   -   2 years, 105 days, 17 hours,
 ↪19 minutes and 25 seconds
System life:        2 years, 146 days, 0 hours, 27 minutes
 ↪and 13 seconds


Largest uptime:     12 hours, 51 minutes and 48 seconds   from
 ↪09:29:18 02/03/16
Shortest uptime:    5 seconds   from   22:20:54 12/02/17
Average uptime:     1 hour, 24 minutes and 21 seconds


Largest downtime:   23 days, 3 hours, 23 minutes and 30 seconds
 ↪from   13:49:42 04/12/16
Shortest downtime:  8 seconds   from   17:08:00 03/01/17
Average downtime:   1 day, 5 hours, 11 minutes and 44 seconds


Current uptime:     1 hour, 50 minutes and 0 seconds   since
 ↪17:37:32 02/07/18

您可以将报告更改为表格格式 (-t),与其他任何选项结合使用,在本例中,自最近两次启动以来 (-S -2)


$ tuptime -t -S -2
687  14:07:36 02/04/18   1 hour, 28 minutes and 22 seconds
 ↪15:35:58 02/04/18   OK   3 days, 2 hours, 1 minute
 ↪and 34 seconds
688  17:37:32 02/07/18   1 hour, 26 minutes and 13 seconds

或者您可以更改为列表报告格式 (-l) 并显示结果,直到第二次启动 (-U 2)


$ tuptime -l -U 2
Startup:  1  at  22:21:49 09/10/15
Uptime:   50 minutes and 44 seconds
Shutdown: OK  at  23:12:33 09/10/15
Downtime: 13 seconds


Startup:  2  at  23:12:46 09/10/15
Uptime:   1 minute and 2 seconds
Shutdown: OK  at  23:13:48 09/10/15
Downtime: 18 hours, 57 minutes and 18 seconds

tuptime 还接受使用 tsincetuntil 选项的特定日期之间的范围。两者都需要一个以秒为单位的 epoch 日期参数。另一个示例是从过去 365 天到现在的报告,可能用于检查您的提供商的 SLA。

首先,使用 date 命令获取一年前的 epoch 日期


$ date --date="1 year ago" +%s
1486490845

接下来,将其在 tsince 下传递给 tuptime


$ tuptime --tsince 1486490845

这是一个 CSV 格式的从上个月的第一天到最后一天的报告示例。同样,使用 date 获取第一天和最后一天的日期作为时间戳,并将两者传递给 tuptime


$ date -d "-1 month 00:00" +%s
1514761200
$ date -d "this month -1 second 00:00" +%s
1517439599
$ tuptime --tsince 1514761200 --tuntil 1517439599 --csv

或者您可以列出所有条目 (-l),按正常运行时间 (-o u) 排序,而不是按启动编号排序,反向排序 (-r),包括正在运行的内核 (-k)


$ tuptime -l -o u -r -k

该手册包含每个选项的详细信息,并包含一些关于同步日期和时间的有趣注释,这些注释在出现问题时可能有所帮助。有关更多信息,请参阅 https://github.com/rfrail3/tuptime.git

Ricardo Fraile 担任系统管理员已近十年,自 20 世纪 90 年代末以来,他一直在玩 Linux 和 FreeBSD。他很乐意回答发送至 rfraile@rfraile.eu 的任何问题或评论。

加载 Disqus 评论