Есть ли программное обеспечение, которое отслеживает использование окон и приложений?
Есть ли программное обеспечение, которое хранит время моей деятельности и дает отчет? На основе сфокусированного окна и заголовка окна. Отчет будет просто показывать время, потраченное на конкретное окно и его заголовок, например:
Application Title Time
Firefox Ask Ubuntu - Mozilla Firefox 5:58
2 ответа
РЕДАКТИРОВАТЬ: версия скрипта с отсортированными отчетами можно найти здесь
Всегда весело писать сценарий для него!
Сценарий ниже выдаст вывод (отчет), например:
------------------------------------------------------------
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
окна,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
, Файл имеет метку времени с датой и временем создания. Файл обновляется раз в минуту.В нижней части файла вы можете увидеть как время начала, так и отметку времени последнего редактирования. Таким образом, вы всегда можете увидеть, сколько времени занимает файл.
Если скрипт перезапускается, создается новый файл с новой (начальной) отметкой времени.
Если все работает нормально, добавьте в Startup Applications: Dash > Startup Applications > Add. Добавьте команду:
/bin/bash -c "sleep 15 && python3 /path/to/window_logs.py"
Больше заметок
~/.uselogs
это скрытый каталог по умолчанию. Нажмите (вnautilus
) Ctrl + H, чтобы сделать его видимым.Как таковой, скрипт округляет активность окна за 5 секунд, предполагая, что менее 5 секунд на самом деле не использует окно. Если вы хотите изменить значение, установите его в заголовке скрипта в строке:
# -- set update/round time (seconds) period = 5 # --
Сценарий чрезвычайно "мало на сок". Кроме того, поскольку обновления времени для каждого окна выполняются внутри скрипта, количество строк в файле журнала ограничено фактическим количеством используемых окон.
Тем не менее, я бы не стал запускать сценарий, например, несколько недель подряд, чтобы предотвратить накопление слишком большого количества строк (= записей окна) для обслуживания.
Есть arbtt
это именно то, что вы описываете: https://www.joachim-breitner.de/blog/336-The_Automatic_Rule-Based_Time_Tracker
Вот еще более простой сценарий, написанный на bash на основе xdotool, упомянутого в ответе Джейкоба Влайма.
while :
do
sleep 1
echo $(date +"%H:%M:%S") $(xdotool getactivewindow getwindowname) >> $datapath/log-$(date +"%Y-%m-%d").txt;
done
Обязательно укажите, что такое $ datapath. Сохраните файл как scrip.sh и запустите его в фоновом режиме:
./script.sh &
Убейте его в своем списке вакансий, чтобы остановить его. Или выведите его на передний план с помощью fg и используйте ctrl-c.
Если вы предпочитаете выполнять выборку с частотой менее 1 секунды, измените строку сна. Он сохраняет данные за каждый день в отдельном файле. Предполагая, что в каждой строке 300 байт, выборка с этой частотой будет генерировать примерно 3600*24*300 = 25 МБ данных в день. Его можно легко сжать (при постобработке), так как многие заголовки окон повторяются.
Если вам нужны проценты использования, awk второй столбец и конвейер для uniq -c, а затем конвейер для sort -nr. Это даст вам общее количество минут.