EDIT: тут можна знайти версію сценарію з відсортованими звітами
Завжди весело писати сценарій для цього!
Сценарій, наведений нижче, дасть результат (звіт) на зразок:
------------------------------------------------------------
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
============================================================
..що оновлюється раз на хвилину.
Примітки
Можливо, у звіті з'являться вікна під категорією: "Невідомо". Це той випадок, коли у Windows є pid 0
( tkinter
вікна, наприклад, Idle
windows, Python
IDE). Однак їх назва вікна та використання буде повідомлено правильно.
Екран блокування з введенням пароля повідомляється про "вікно введення 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
Як налаштувати
Сценарій повинен xdotool
отримати інформацію про вікно
sudo apt-get install xdotool
Скопіюйте скрипт у порожній файл, збережіть його як window_logs.py
Тестово запустіть скрипт: обривте скрипт командою (з терміналу):
python3 /path/to/window_logs.py
Через одну хвилину сценарій створює файл журналу з першими результатами в ~/.usagelogs
. Файл розміщений з печаткою часу та датою створення та часом створення. Файл оновлюється раз на хвилину.
У нижній частині файлу ви можете побачити час початку та час останнього редагування. Таким чином, ви завжди можете побачити, який часовий проміжок файлу.
Якщо скрипт перезапуститься, створюється новий файл із новою часовою маркою (старт).
Якщо все працює добре, додайте до програми запуску програми: тире> програми запуску> Додати. Додайте команду:
/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
# --
Сценарій надзвичайно "мало соку". Крім того, оскільки оновлення часу на вікно робиться всередині сценарію, кількість рядків у файлі журналу обмежується фактичною кількістю використаних вікон.
Тим не менш, я б не запускав сценарій протягом тижнів поспіль, наприклад, щоб запобігти накопиченню занадто багато рядків (= віконних записів) для підтримки.