¿Cómo encontrar el tiempo total que pasé en mi computadora portátil en este año?

17

Me interesa saber el tiempo total que paso trabajando en mi computadora portátil en 2016.

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

me da el tiempo de actividad total de la computadora portátil en este formato:

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

¿Cómo lo sumaré?

    
pregunta daltonfury42 22.12.2016 - 04:55

3 respuestas

5

Aquí hay una versión de 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
        }'

last tiene la última columna en el formato (<days>+hours:minutes) , donde days+ se descarta si el período es inferior a 1 día.

Aquí, el primer comando awk genera la última columna, la duración de interés, para reboot entries.

Para el segundo comando awk :

  1. FS es [(+:)] , es decir, paréntesis o + o : . Entonces, (h:m) se divide en , h , m y (los primeros y últimos campos están vacíos), y (d+h:m) se divide en , d , h , m y (de nuevo, el primer y el último campo están vacíos).
  2. Luego tomamos el segundo campo por minutos, el tercero por horas y el cuarto por días. El cuarto campo será el primero, vacío, si los días no están presentes. Entonces, simplemente agregaremos 0 en este caso.
  3. Luego incrementamos las horas y los días si los minutos y las horas están por encima de 60 y 24 respectivamente. Tenga en cuenta que awk hace división de punto flotante, por lo que h y d ahora pueden tener partes fraccionarias.
  4. Luego imprimimos los números como enteros ( %d ), por lo que cualquier parte fraccionaria se ignora.
respondido por el muru 22.12.2016 - 10:39
8

Probar con script bash y extender tu comando. Uso dateutils para sumar la duración del tiempo.

Por lo tanto, para usar este script se necesita el paquete dateutils disponible a través de apt . ( sudo apt install dateutils )

Este script también tiene en cuenta el tiempo de actividad actual (sesión actual), por lo tanto, es más preciso. Los segundos no se cuentan. La unidad más baja informada es 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"
  • Primero, los tiempos de actividad desde el último reinicio se listan y formatean para extraer el día, las horas, los minutos y la segunda información. Esto luego se guarda en temp .
  • Se establece una fecha falsa de referencia llamada org = 2015-01-01 a la que se agrega el tiempo de actividad actual.
  • Entonces todos los aumentos de tiempo acumulados se agregan a la variable new
  • La duración entre org y el tiempo de actividad neto new se encuentra por diferencia.

Salida:

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

El siguiente script es para el tiempo de actividad en exactamente un año desde el día en que se ejecuta el script .

#!/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"
    
respondido por el ankit7540 22.12.2016 - 07:59
5

Aquí hay una implementación de Python de lo que quiero, pero estoy seguro de que hay una forma elegante de hacerlo con 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))
    
respondido por el daltonfury42 22.12.2016 - 09:39

Lea otras preguntas en las etiquetas