Nota: Esta é apenas uma resposta parcial, lidando apenas com a diferença entre o tempo de atividade e o tempo suspenso.
Você pode determinar a diferença entre o tempo de atividade e o tempo suspenso utilizando algumas das informações disponíveis por meio de /proc/timer_list
.
Exemplo 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
Então o tempo de atividade = (3 * 60 + 43) * 60 = 13,3800 segundos. Tempo ativo = 12.735 segundos. Portanto, tempo suspenso = 13.300 - 12.735 = 645 segundos
Ou apenas observe o tempo de deslocamento de cada CPU para obter seu tempo suspenso diretamente:
$ 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
Ou 668 segundos para cada CPU.
Por que os dois métodos diferem em 23 segundos? Porque o tempo de atividade é listado apenas no minuto. Então essa resposta é realmente 645 +59 -0 segundos (ou, dependendo do tempo de atividade, 645 + - 30 segundos.
Então, o que você parece querer executar isso durante o desligamento:
$ cat /proc/timer_list | grep "now at"
now at 25561396304263 nsecs
e divida esse número por 3,6e12 (ou seja, 7,1 horas de tempo ativo)