我需要计算系统一天的总工作时长。也就是说,计算开机和关机之间的时间,并减去系统挂起的时间。最终输出必须是一天的总工作时长。我尝试了一些第三方软件和我自己的基于命令的操作,但都失败了。我该如何计算呢?有什么办法吗?我尝试了一个想法来得到这样的结果:
- 系统开机时间:“时间”
- 系统暂停于:“时间”
- 系统唤醒时间:"时间"
- 系统关闭于:“时间”
- 总工作时间:((系统关闭 - 系统开启) - (睡眠时间和唤醒时间之差))
我认为这是项艰巨的任务。你能帮助我吗?
答案1
注意:这只是部分答案,仅处理正常运行时间和暂停时间之间的差异。
您可以利用通过 提供的一些信息来确定正常运行时间和暂停时间之间的差异/proc/timer_list
。
示例 1:
$ uptime
11:58:46 up 3:43, 2 users, load average: 0.00, 0.01, 0.05
$ cat /proc/timer_list | grep "now at"
now at 12734872068331 nsecs
因此正常运行时间 = (3 * 60 + 43) * 60 = 13,3800 秒。活动时间 = 12,735 秒。因此暂停时间 = 13,300 - 12,735 = 645 秒
或者,只需查看每个 CPU 的偏移时间即可直接获取其暂停时间:
$ cat /proc/timer_list | grep -A 1 "ktime_get_boottime"
.get_time: ktime_get_boottime
.offset: 668016000993 nsecs
--
.get_time: ktime_get_boottime
.offset: 668016000993 nsecs
--
.get_time: ktime_get_boottime
.offset: 668016000993 nsecs
--
.get_time: ktime_get_boottime
.offset: 668016000993 nsecs
--
.get_time: ktime_get_boottime
.offset: 668016000993 nsecs
--
.get_time: ktime_get_boottime
.offset: 668016000993 nsecs
--
.get_time: ktime_get_boottime
.offset: 668016000993 nsecs
--
.get_time: ktime_get_boottime
.offset: 668016000993 nsecs
或者每个 CPU 668 秒。
为什么这两种方法相差 23 秒?因为正常运行时间仅按分钟列出。因此答案实际上是 645 +59 -0 秒(或者,取决于正常运行时间是否舍入,645 +- 30 秒)。
因此,您似乎想在关机期间运行此操作:
$ cat /proc/timer_list | grep "now at"
now at 25561396304263 nsecs
然后将这个数字除以 3.6e12(即 7.1 小时活动时间)
答案2
所需的所有信息都在journalctl
。虽然不是完整的答案,但是这个脚本是一个好的开始,你可以调整:
$ suspendtime
Oct 31 05:55:19 to Oct 31 16:54:26 lasting 39,547 seconds
Oct 31 23:21:21 to Nov 01 04:29:12 lasting 18,471 seconds
Nov 01 05:51:27 to Nov 01 17:08:34 lasting 40,627 seconds
Nov 02 00:01:33 to Nov 02 10:28:46 lasting 37,633 seconds
Nov 02 18:15:59 to Nov 02 19:10:14 lasting 3,255 seconds
Nov 02 21:17:33 to Nov 03 05:31:54 lasting 33,261 seconds
Nov 03 12:06:39 to Nov 03 14:22:50 lasting 8,171 seconds
Nov 03 22:28:12 to Nov 04 04:17:13 lasting 20,941 seconds
Nov 04 05:49:40 to Nov 04 16:48:52 lasting 39,552 seconds
Nov 04 21:45:48 to Nov 05 04:19:26 lasting 23,618 seconds
Nov 05 05:52:05 to Nov 05 16:32:38 lasting 38,433 seconds
Nov 05 21:12:18 to Nov 06 04:16:50 lasting 25,472 seconds
Nov 06 05:50:45 to Nov 06 16:22:54 lasting 37,929 seconds
Linux uptime 574,835 seconds (6 Days 15 Hours 40 Minutes 35 Seconds)
13 Suspends 366,910 seconds (4 Days 5 Hours 55 Minutes 10 Seconds)
Real uptime 207,925 seconds (2 Days 9 Hours 45 Minutes 25 Seconds)
bash 脚本已经完成了计算每天暂停时间的繁重工作journalctl
。修改脚本以获取系统启动和关闭时间将是一个小小的改进。