有没有一款软件可以记录我的活动时间并提供报告?基于焦点窗口和窗口标题。报告只会显示特定窗口及其标题所花费的时间,例如:
Application Title Time
Firefox Ask Ubuntu - Mozilla Firefox 5:58
答案1
编辑:脚本的一个版本附有分类报告可以被找寻到这里
为它编写脚本总是很有趣!
下面的脚本将产生如下输出(报告):
------------------------------------------------------------
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
,IDEPython
)时,就会出现这种情况。但是,它们的窗口标题和使用情况将被正确报告。带有密码输入的锁屏被报告为“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
。该文件带有创建日期和时间的时间戳。该文件每分钟更新一次。在文件底部,您可以看到最新编辑的开始时间和时间戳。这样,您就可以随时看到文件的时间跨度。
如果脚本重新启动,则会创建一个具有新(开始)时间戳的新文件。
如果一切正常,请添加到启动应用程序:Dash > 启动应用程序 > 添加。添加命令:
/bin/bash -c "sleep 15 && python3 /path/to/window_logs.py"
更多笔记
~/.uselogs
默认情况下是隐藏目录。按 (innautilus
) Ctrl+H可将其显示出来。事实上,脚本以 5 秒为单位对窗口的活动时间进行舍入,假设少于 5 秒的时间没有真正使用窗口。如果您想更改该值,请在脚本的开头设置该值:
# -- set update/round time (seconds) period = 5 # --
脚本极其“缺乏活力”。此外,由于时间更新每个窗口在脚本内部完成,日志文件中的行数受限于实际使用的窗口数。
尽管如此,我不会连续数周运行该脚本,以防止积累太多行(=窗口记录)而无法维护。
答案2
有arbtt
一个方法可以实现你所描述的功能:https://www.joachim-breitner.de/blog/336-The_Automatic_Rule-Based_Time_Tracker
更新:该项目仍然存在(2020 年 10 月),arbtt 主页在这里:http://arbtt.nomeata.de/
github 项目在这里:https://github.com/nomeata/arbtt
答案3
这是一个基于 Jacob Vlijm 的回答中提到的 xdotool 用 bash 编写的更简单的脚本。
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 秒的速率进行采样,请更改 sleep 行。它会将每天的数据保存在单独的文件中。假设每行 300 字节,以此速率采样每天将生成大约 3600*24*300 = 25MB 的数据。由于许多窗口标题重复,因此可以轻松压缩(在后期处理中)。
如果您想要使用率百分比,请 awk 第二列并将其通过管道传输到 uniq -c,然后通过管道传输到 sort -nr。这样您就可以得到总分钟数。