web-dev-qa-db-fra.com

Comment trouver le temps total que j'ai passé sur mon ordinateur portable cette année?

Je suis intéressé à connaître le temps total passé sur mon ordinateur portable en 2016.

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

me donne la disponibilité totale de l'ordinateur portable dans ce format:

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

Maintenant, comment puis-je l'additionner?

17
daltonfury42

Voici une version 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
        }'

La dernière colonne de last est au format (<days>+hours:minutes), où days+ est supprimé si la période est inférieure à 1 jour.

Ici, la première commande awk affiche la dernière colonne, la durée d'intérêt, pour les entrées reboot.

Pour la deuxième commande awk:

  1. FS est [(+:)], c'est-à-dire entre parenthèses o+o:. Donc, (h:m) est divisé en, h, m et (premier et dernier champs vides), et (d+h:m) est divisé en, d, h, m et (encore une fois, le premier et le dernier champs sont vides).
  2. Ensuite, nous prenons l’avant-dernière zone pour les minutes, la troisième pour les heures et la quatrième pour les jours. Le quatrième et dernier champ sera le premier, vide, si les jours ne sont pas présents. Nous allons donc simplement ajouter 0 dans ce cas.
  3. Ensuite, nous calculons les heures et les jours si les minutes et les heures sont supérieures à 60 et 24 respectivement. Notez que awk effectue la division en virgule flottante, donc h et d peuvent maintenant avoir des fractions.
  4. Ensuite, nous imprimons les nombres sous forme de nombres entiers (%d), de sorte que toute partie décimale est ignorée.
5
muru

Essayer avec le script bash et étendre votre commande. J'utilise dateutils pour additionner la durée.

Par conséquent, pour utiliser ce script, il vous faut le paquetage dateutils disponible via apt. (Sudo apt install dateutils)

Ce script prend en compte le temps de disponibilité actuel (session actuelle) également, donc plus précis. Les secondes ne sont pas comptées. L'unité la plus basse rapportée est la minute.

#!/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,\}\))/\1d\2h\3m/g ;s/(\([0-9]\{1,\}\):\([0-9]\{1,\}\))/\1h\2m/g'  )
curr=$( cat /proc/uptime |  Perl -ne '/(\d*)/ ; printf "%02d:%02d:%02d\n",int($1/86400),int(($1%86400)/3600),int(($1%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"
  • Les temps de disponibilité du dernier redémarrage sont d'abord répertoriés et formatés pour extraire les informations relatives au jour, aux heures, aux minutes et aux secondes. Ceci est ensuite enregistré dans temp.
  • Une fausse date de référence est définie, appelée org = 2015-01-01, à laquelle la disponibilité actuelle est ajoutée.
  • Ensuite, tous les temps de disponibilité cumulés sont ajoutés à la variable new
  • La durée entre org et la disponibilité nette new est obtenue par différence.

Sortie:

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

Le script suivant concerne le temps de disponibilité exactement n an à compter du jour où le script est exécuté.

#!/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,\}\))/\1d\2h\3m/g ;s/(\([0-9]\{1,\}\):\([0-9]\{1,\}\))/\1h\2m/g'  )
curr=$( cat /proc/uptime |  Perl -ne '/(\d*)/ ; printf "%02d:%02d:%02d\n",int($1/86400),int(($1%86400)/3600),int(($1%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"
8
ankit7540

Voici une implémentation de python de ce que je veux, mais je suis sûr qu'il existe un moyen élégant de le faire avec 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))
5
daltonfury42