Как найти общее время, проведенное на моем ноутбуке в этом году?

Итак, мы видим заключение

Не, только вы.

Итак, мы видим вывод

, если я устанавливаю программа из репозитория эта программа принадлежит мне и не связана с операционной системой

1
задан 22 December 2016 в 14:40

2 ответа

Попытка с помощью скрипта bash и расширение вашей команды. Я использую dateutils, чтобы добавить продолжительность времени.

Следовательно, для использования этого скрипта необходим пакет dateutils, доступный через apt. (sudo apt install dateutils)

Этот сценарий также учитывает текущее время безотказной работы (нынешняя сессия), следовательно, более точный. Секунды не учитываются. Самая низкая единица сообщения - минут.

#!/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"
Сначала вы можете просмотреть и отформатировать время последней перезагрузки, чтобы извлечь день, часы, минуты и вторую информацию. Затем он сохраняется в temp. Исходная фальшивая дата устанавливается как org = 2015-01-01, к которой добавляется текущее время безотказной работы. Затем к переменной new добавляются все кумулятивные аппроксимации new. Длительность между org и временем безотказной работы new определяется разницей.

Вывод:

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

Следующий сценарий предназначен для безотказной работы точно в Выход: [!d10 ].

#!/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
ответ дан 23 May 2018 в 03:07
  • 1
    Как-то мне нравятся скрипты bash, но я знаю, что возможны более элегантные ответы. – ankit7540 22 December 2016 в 12:01
  • 2
    Согласно вашему сценарию, в прошлом году я провел 2258 дней, 01 часов, 15 минут в Интернете. – daltonfury42 22 December 2016 в 13:09
  • 3
    Исправлена ​​ошибка. Код уплотнен до 8 строк. – ankit7540 22 December 2016 в 17:26

Вот реализация python того, что я хочу, но я уверен, что есть элегантный способ сделать это с 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
ответ дан 23 May 2018 в 03:07
  • 1
    «Я уверен, что есть элегантный способ сделать это с bash» IMHO Python - лучший выбор. Bash хорош для манипуляций с файлами, а не для расчетов. – Melebius 22 December 2016 в 15:45

Другие вопросы по тегам:

Похожие вопросы: