Есть ли программное обеспечение, которое отслеживает использование окон и приложений?

10

Есть ли программное обеспечение, которое хранит время моей деятельности и дает отчет? На основе сфокусированного окна и заголовка окна. Отчет будет просто показывать время, потраченное на конкретное окно и его заголовок, например:

Application   Title                             Time
Firefox       Ask Ubuntu - Mozilla Firefox      5:58
Ambi
источник
1
В центре программного обеспечения есть трекер времени, который делает именно это
Mateo
1
Это может быть сделано очень легко с доступными программами - давайте не будем назначать мотив для этого, я использовал такую ​​программу, чтобы записать свое время в проекте раньше. Это, конечно, не в «слишком широкой» категории
Матео
В любом случае, я не понимаю, почему этот вопрос сильно опущен. Это нормальный и понятный вопрос. Я нигде на сайте не видел предупреждения «только задать вопрос, на который никто не знает ответа».
Джейкоб Влейм
Привет Амби. Разместил мой ответ. Пожалуйста, дайте мне знать, если вам удастся!
Джейкоб Влейм
Да, может быть, мое описание было неверным - я не хочу шпионить за кем-либо, кроме меня. Я хочу просто получить статистику о том, что я потратил впустую свое время. Я проверил «Обзор отслеживания времени» и «Отслеживание времени GTimeLog», но там вам нужно ввести все вручную - чего я не хочу делать. Jacob Vlijm, спасибо, это именно то, что я искал, за исключением того, что я думал, что есть такое программное обеспечение с GUI
ambi

Ответы:

8

РЕДАКТИРОВАТЬ: версию скрипта с отсортированными отчетами можно найти здесь


Всегда весело писать сценарий для него!

Сценарий ниже выдаст вывод (отчет), например:

------------------------------------------------------------
nautilus
0:00:05 (3%)
------------------------------------------------------------
   0:00:05 (3%)     .usagelogs
------------------------------------------------------------
firefox
0:01:10 (36%)
------------------------------------------------------------
   0:00:05 (3%)     The Asker or the Answerer? - Ask Ubuntu Meta - Mozilla Firefox
   0:00:15 (8%)     scripts - Is there software which time- tracks window & application usage? - Ask Ubuntu - Mozilla Firefox
   0:00:10 (5%)     Ask Ubuntu - Mozilla Firefox
   0:00:15 (8%)     Why is a one line non-understandable answer used as review audit? - Ask Ubuntu Meta - Mozilla Firefox
   0:00:20 (10%)    bash - How to detect the number of opened terminals by the user - Ask Ubuntu - Mozilla Firefox
   0:00:05 (3%)     BlueGriffon - Mozilla Firefox
------------------------------------------------------------
gedit
0:02:00 (62%)
------------------------------------------------------------
   0:02:00 (62%)    2016_06_04_10_33_29.txt (~/.usagelogs) - gedit

============================================================
started: 2016-06-04 10:33:29    updated: 2016-06-04 10:36:46
============================================================


.. который обновляется раз в минуту.

Заметки

  • Отчет, возможно, сообщит о окнах в категории: «Неизвестно». Это тот случай, когда окна есть pid 0( tkinterокна, такие как Idleокна, PythonIDE). Однако их заголовок и использование будут сообщены правильно.

  • Экран блокировки с вводом пароля отображается как «окно ввода nux».

  • Проценты представляют собой округленные проценты, которые могут иногда приводить к незначительным различиям между процентом приложения и суммой процентов его окна.

    Пример: если в приложении используются два окна, каждое 0,7%из которых использует общее время, оба окна будут отчитываться по 1%каждому ( 0.7-> округлено до 1), а отчеты об использовании приложения1% ( 1.4-> округлено до 1)

    Не нужно говорить, что эти различия совершенно не имеют значения для всей картины.

Сценарий

#!/usr/bin/env python3
import subprocess
import time
import os

# -- set update/round time (seconds)
period = 5
# -- 
# don change anything below
home = os.environ["HOME"]
logdir = home+"/.usagelogs"

def currtime(tformat=None):
    return time.strftime("%Y_%m_%d_%H_%M_%S") if tformat == "file"\
           else time.strftime("%Y-%m-%d %H:%M:%S")

try:
    os.mkdir(logdir)
except FileExistsError:
    pass

# path to your logfile
log = logdir+"/"+currtime("file")+".txt"; startt = currtime()

def get(command):
    try:
        return subprocess.check_output(command).decode("utf-8").strip()
    except subprocess.CalledProcessError:
        pass

def time_format(s):
    # convert time format from seconds to h:m:s
    m, s = divmod(s, 60); h, m = divmod(m, 60)
    return "%d:%02d:%02d" % (h, m, s)

def summarize():
    with open(log, "wt" ) as report:
        totaltime = sum([it[2] for it in winlist])
        report.write("")
        for app in applist:
            wins = [r for r in winlist if r[0] == app]
            apptime = sum([it[2] for it in winlist if it[0] == app])
            appperc = round(100*apptime/totaltime)
            report.write(("-"*60)+"\n"+app+"\n"+time_format(apptime)+\
                         " ("+str(appperc)+"%)\n"+("-"*60)+"\n")
            for w in wins:
                wperc = str(round(100*w[2]/totaltime))
                report.write("   "+time_format(w[2])+" ("+\
                             wperc+"%)"+(6-len(wperc))*" "+w[1]+"\n")
        report.write("\n"+"="*60+"\nstarted: "+startt+"\t"+\
                     "updated: "+currtime()+"\n"+"="*60)

t = 0; applist = []; winlist = []
while True:
    time.sleep(period)
    frpid = get(["xdotool", "getactivewindow", "getwindowpid"])
    frname = get(["xdotool", "getactivewindow", "getwindowname"])
    app = get(["ps", "-p", frpid, "-o", "comm="]) if frpid != None else "Unknown"
    # fix a few names
    if "gnome-terminal" in app:
        app = "gnome-terminal"
    elif app == "soffice.bin":
        app = "libreoffice"
    # add app to list
    if not app in applist:
        applist.append(app)
    checklist = [item[1] for item in winlist]
    if not frname in checklist:
        winlist.append([app, frname, 1*period])
    else:
        winlist[checklist.index(frname)][
            2] = winlist[checklist.index(frname)][2]+1*period
    if t == 60/period:
        summarize()
        t = 0
    else:
        t += 1

Как настроить

  1. Сценарий должен xdotoolполучить информацию о окне

    sudo apt-get install xdotool
  2. Скопируйте скрипт в пустой файл, сохраните его как window_logs.py

  3. Тестовый запуск скрипта: запустите скрипт командой (из терминала):

    python3 /path/to/window_logs.py

    Через одну минуту сценарий создает файл журнала с первыми результатами в ~/.usagelogs. Файл имеет метку времени с датой и временем создания. Файл обновляется раз в минуту.

    В нижней части файла вы можете увидеть как время начала, так и отметку времени последнего редактирования. Таким образом, вы всегда можете увидеть, сколько времени занимает файл.

    Если скрипт перезапускается, создается новый файл с новой (начальной) отметкой времени.

  4. Если все работает нормально, добавьте в Startup Applications: Dash> Startup Applications> Add. Добавьте команду:

    /bin/bash -c "sleep 15 && python3 /path/to/window_logs.py"

Больше заметок

  • ~/.uselogsэто скрытый каталог по умолчанию. Нажмите (in nautilus) Ctrl+, Hчтобы сделать его видимым.
  • Как таковой, скрипт округляет активность окна за 5 секунд, предполагая, что менее 5 секунд на самом деле не использует окно. Если вы хотите изменить значение, установите его в заголовке скрипта в строке:

    # -- set update/round time (seconds)
    period = 5
    # -- 
    
  • Сценарий чрезвычайно "мало на сок". Кроме того, поскольку обновления времени для каждого окна выполняются внутри скрипта, количество строк в файле журнала ограничено фактическим количеством используемых окон.

    Тем не менее, я бы не стал запускать сценарий, например, несколько недель подряд, чтобы предотвратить накопление слишком большого количества строк (= записей окна) для обслуживания.

Якоб Влейм
источник
1
Именно то, что я искал, за исключением того, что хорошо иметь графический интерфейс, но я могу сделать это сам. Спасибо.
Амби