Como encontrar o tempo total que passei no meu laptop neste ano?

17

Estou interessado em saber o tempo total que gasto trabalhando no meu laptop em 2016.

last reboot --since 2016-01-01 --until 2016-12-31 | grep -o '(.*)' | grep  -v '-'

me fornece o tempo total de atividade do laptop neste formato:

(01:33) 
(04:40) 
(01:31) 
(1+06:41) 
(02:47) 
(00:30)

Agora, como eu adiciono isso?

    
por daltonfury42 22.12.2016 / 05:55

3 respostas

5

Aqui está uma versão do awk + awk:

last ... | awk '/reboot/{print $NF}' |
    awk -F '[(+:)]' '
        {
            d += $(NF - 3); h += $(NF - 2); m += $(NF - 1)
        }
        END {
            carry = m / 60; h += carry;
            carry = h / 24; d += carry;
            printf "%d days, %d hours, %d minutes\n", d, h % 24, m % 60
        }'
A última coluna de

last está no formato (<days>+hours:minutes) , em que days+ é descartado se o período for menor que 1 dia.

Aqui, o primeiro comando awk gera a última coluna, a duração dos juros, para reboot entradas.

Para o segundo comando awk :

  1. FS é [(+:)] , ou seja, parênteses ou + ou : . Assim, (h:m) é dividido em , h , m e (primeiro e último campos vazios) e (d+h:m) é dividido em , d , h , m e (novamente, primeiro e último campos vazios).
  2. Então, tomamos o segundo e último campo por minutos, o terceiro por último por horas e o quarto por dias. O quarto e último campo será o primeiro campo vazio se os dias não estiverem presentes. Então, vamos simplesmente adicionar 0 neste caso.
  3. Então aumentamos as horas e os dias se minutos e horas estiverem acima de 60 e 24, respectivamente. Note que awk faz divisão de ponto flutuante, então h e d agora podem ter partes fracionárias.
  4. Em seguida, imprimimos os números como inteiros ( %d ), portanto, qualquer parte fracionária é ignorada.
por muru 22.12.2016 / 11:39
8

Experimentando com o script bash e estendendo seu comando. Eu uso dateutils para adicionar a duração do tempo.

Portanto, para usar este script, é necessário o pacote dateutils disponível por meio de apt . ( sudo apt install dateutils )

Este script leva em conta o tempo de atividade atual (atual sessão) também, portanto, mais preciso. Segundos não são contados. A unidade mais baixa informada é minuto.

#!/bin/bash
# Total uptime reported.
temp=$(last reboot --since 2016-01-01 --until 2016-12-31 | grep -o '(.*)' | grep  -v '-' | sed 's/(\([0-9]\{1,\}\)+\([0-9]\{1,\}\):\([0-9]\{1,\}\))/dhm/g ;s/(\([0-9]\{1,\}\):\([0-9]\{1,\}\))/hm/g'  )
curr=$( cat /proc/uptime |  perl -ne '/(\d*)/ ; printf "%02d:%02d:%02d\n",int(/86400),int((%86400)/3600),int((%3600)/60)'  )
echo "Total run time (days:hours:minutes)"
curr="2015-01-01T"$curr
org="2015-01-01T00:00:00"
new=$(dateutils.dadd $curr $temp )
dateutils.ddiff $org $new -f "%dd %Hh %Mm"
  • Primeiro, o tempo de atividade da última reinicialização é listado e formatado para extrair o dia, as horas, os minutos e a segunda informação. Isso é salvo em temp .
  • Uma data falsa de referência é definida como org = 2015-01-01 , à qual o tempo de atividade atual é adicionado.
  • Em seguida, todos os upgrimes cumulativos são adicionados à variável new
  • A duração entre org e a atividade líquida new é encontrada por diferença.

Saída:

vayu@helix:$ ./uptime_record.sh
Total run time (days:hours:minutes)
57d 20h 36m

O script a seguir é para o tempo de atividade em exatamente um ano a partir do dia em que o script é executado .

#!/bin/bash
# Total uptime reported since exactly 1 year (from the time script is run).
now="$(date +'%Y-%m-%d')" ;
last_y=$(dateutils.dadd $now -1y)
temp=$(last reboot --since "$last_y" --until "$now" | grep -o '(.*)' | grep  -v '-' | sed 's/(\([0-9]\{1,\}\)+\([0-9]\{1,\}\):\([0-9]\{1,\}\))/dhm/g ;s/(\([0-9]\{1,\}\):\([0-9]\{1,\}\))/hm/g'  )
curr=$( cat /proc/uptime |  perl -ne '/(\d*)/ ; printf "%02d:%02d:%02d\n",int(/86400),int((%86400)/3600),int((%3600)/60)'  )
echo "Total run time in one year (days:hours:minutes)"
curr="1980-01-01T"$curr
org="1980-01-01T00:00:00"
new=$(dateutils.dadd $curr $temp )
dateutils.ddiff $org $new -f "%dd %Hh %Mm"
    
por ankit7540 22.12.2016 / 08:59
5

Aqui está uma implementação em python do que eu quero, mas tenho certeza que existe uma maneira elegante de fazer isso com o bash:

import subprocess
output = subprocess.run("last reboot --since 2016-01-01 --until 2016-12-31 | grep -o '(.*)' | grep  -v '-'| sed -e 's/(//g; s/)//g; s/+/:/g'", shell=True, stdout=subprocess.PIPE, universal_newlines=True)
mins_total = 0

for line in output.stdout.split('\n')[:-1]:
    try:
        (hrs, mins) = [int(k) for k in line.split(':')]
        days = 0
    except:
        (days, hrs, mins) = [int(k) for k in line.split(':')]
    mins_total += (days*24 + hrs)*60 + mins

print("Hours: " + str(mins_total/60))
print("Days: " + str(mins_total/60/24))
    
por daltonfury42 22.12.2016 / 10:39