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

17

Je souhaite connaître le temps total passé à travailler 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?

daltonfury42
la source
pouvez-vous me dire le sens de (1 + 06: 41)?
Kashish
@kashish 1 jour, 6 heures, 41 minutes
muru
Le fait est que les wtmpjournaux (ce que vous voyez dans la sortie de la lastcommande) sont configurés pour tourner mensuellement (en /etc/logrotate.conf), ce qui signifie qu'après une certaine période, le journal le plus ancien est supprimé. En d'autres termes, quoi que vous last
essayiez
@Serg J'ai désactivé logrotate pour wtmp. Cela fait plus d'un an que je l'ai fait, et la taille du fichier est actuellement de 3,7M. Je ne vois donc aucune raison pour laquelle il faudrait effectuer une rotation mensuelle. ;)
daltonfury42
@ daltonfury42 S'il est désactivé, il ne tournera pas. La plupart des utilisateurs ne le font pas.
Sergiy Kolodyazhnyy

Réponses:

5

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

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

Ici, la première awkcommande affiche la dernière colonne, la durée d'intérêt, pour les rebootentrées.

Pour la deuxième awkcommande:

  1. FSest [(+:)], c'est-à-dire des parenthèses ou + ou : . Alors, (h:m)est divisé à , h, met (premier et dernier champs vides), et (d+h:m)est divisé à , d, h, met (encore une fois, d' abord et derniers champs vides).
  2. Ensuite, nous prenons l'avant-dernier champ pour les minutes, l'avant-dernier pour les heures et l'avant-dernier pour les jours. L'avant-dernier champ sera le premier champ vide si aucun jour n'est présent. Donc, nous allons simplement ajouter 0dans ce cas.
  3. Ensuite, nous augmentons les heures et les jours si les minutes et les heures sont respectivement supérieures à 60 et 24. Notez que awk fait une division en virgule flottante, donc het dpeut maintenant avoir des parties fractionnaires.
  4. Ensuite, nous imprimons les nombres sous forme d'entiers ( %d), de sorte que toute partie fractionnaire est ignorée.
muru
la source
8

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

Par conséquent, pour utiliser ce script, il faut dateutilsdisposer du package disponible via apt. ( sudo apt install dateutils)

Ce script prend également en compte la disponibilité actuelle (session actuelle), donc plus précise. Les secondes ne sont pas comptées. L'unité la plus basse signalé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 le jour, les heures, les minutes et les secondes informations. Il 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 fonctionnement cumulés sont ajoutés à la variable new
  • La durée entre orget le temps de disponibilité net newse trouve par différence.

Production:

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

Le script suivant concerne la disponibilité dans exactement un an à compter de la date d'exécution du 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,\}\))/\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"
ankit7540
la source
1
D'une certaine manière, j'aime les scripts bash, mais je sais ici que des réponses plus élégantes sont possibles.
ankit7540
Selon votre script, j'ai passé 2258 jours, 01 heures, 15 minutes en ligne l'année dernière.
daltonfury42
Erreur corrigée. Code compacté à 8 lignes.
ankit7540
5

Voici une implémentation python de ce que je veux, mais je suis sûr qu'il existe une façon élégante 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))
daltonfury42
la source
3
"Je suis sûr qu'il existe une manière élégante de le faire avec bash" IMHO Python est un meilleur choix. Bash est bon pour les manipulations de fichiers, pas pour les calculs.
Melebius