我正在寻找一种简单的方法来确定我每天花在电脑上的大致时间。如果你试图监控进程、按键、鼠标点击等,这可能是一项艰巨的任务,因为一个人可以做任何事情,从思考编码问题、阅读网络文章、打电话,到遛狗。电脑无法读懂我的想法。由于我 24/7 都开着电脑,监控登录不起作用。
我突然想到记录计算机在屏幕保护模式下花费的时间。这样我的误差就不会大于空闲到屏幕保护的时间与进入屏幕保护模式的次数的乘积。从 24 小时中减去这个数字,我就能得到一个对我的目的来说合理的估计值。
问题是:我不知道如何记录屏幕保护程序的打开和关闭时间。目前,我在大多数机器上运行的是 Ubuntu 10.10,即将开始将其中一些机器升级到 11.04。
有任何想法吗?
[编辑] 经过更多的谷歌搜索,我偶然发现了 dbus-monitor,它看起来可能有用,但缺少一个重要因素。这是我正在运行的脚本,它将监视器作为守护进程启动:
#!/bin/bash
RUNNING=`ps -A | grep "dbus-monitor"`
if [ ! $RUNNING ]; then
echo "(Re)starting dbus-monitor daemon"
nohup dbus-monitor "--profile" "type='signal',interface='org.gnome.ScreenSaver'" >> ${HOME}/sc.log &
fi
这是锁定和解锁屏幕几次后产生的输出:
sig 1304860712 153829 2 /org/freedesktop/DBus org.freedesktop.DBus NameAcquired
sig 1304860717 318732 462 /org/gnome/ScreenSaver org.gnome.ScreenSaver ActiveChanged
sig 1304860725 547928 463 /org/gnome/ScreenSaver org.gnome.ScreenSaver ActiveChanged
sig 1304861018 17 464 /org/gnome/ScreenSaver org.gnome.ScreenSaver ActiveChanged
sig 1304862919 403523 466 /org/gnome/ScreenSaver org.gnome.ScreenSaver ActiveChanged
第二列显然是 unix UTC(以秒为单位)。缺少的要素是它无法识别屏幕保护程序是打开还是关闭!我想我可以假设它们从 NameAcquired 发生时开始切换,但这让我感到不安,因为可能会有一个我无法预料的缺失或额外事件,这会导致一切不同步。
非常感谢您的想法。
坎宁安
答案1
我想感谢并贡献一个简单的原始脚本(可以改进),将其放在启动应用程序中:
xterm -e logSessionLock.sh
它也为系统崩溃/断电做好了准备。它没有经过大量测试……但到目前为止运行良好。它将创建 2 个文件,一个在 $HOME(日志),另一个在 /tmp(系统崩溃解决方法)
登录会话锁
#!/bin/bash
logFile="."`basename $0`".log"
function FUNClog {
strTime=`gnome-screensaver-command --time`
strDate=`date +"%Y%m%d-%H%M%S"`
strLog="$strDate ($1) $strTime"
}
function FUNCwriteLog {
echo $strLog >>$HOME/$logFile
echo $strLog
}
active=false
firstTime=true
# restores last log entry in case of a system crash
strLog=`cat "/tmp/$logFile.tmp"`
FUNCwriteLog
echo "" >"/tmp/$logFile.tmp"
if [[ -n "$strLog" ]]; then #if has something, it was active when the system crashed
active=true
fi
while true; do
if gnome-screensaver-command --query |grep -q "The screensaver is active"; then
if ! $active; then
# restore the saved tmp log
strLog=`cat "/tmp/$logFile.tmp"`
FUNCwriteLog
# update log (can be off when this line is reached? once it seem to happen...)
FUNClog BEGIN
FUNCwriteLog #logs the begin time
active=true
else
FUNClog ON #stores the ammount of time the screensaver has been ON
echo $strLog >"/tmp/$logFile.tmp"
fi
else
if $active; then
FUNCwriteLog #saves the ammount of time the screensaver has been ON
FUNClog OFF
FUNCwriteLog
echo "" >"/tmp/$logFile.tmp"
active=false
fi
fi
sleep 1
done
日志如下:
20120214-191528 (BEGIN) The screensaver has been active for 0 seconds.
20120214-193602 (ON) The screensaver has been active for 1234 seconds.
20120214-193603 (OFF) The screensaver is not currently active.
答案2
这 ”工作狂“软件包不仅可以跟踪您是否在使用计算机并帮助您在白天休息,而且还提供了一组很好的统计数据,包括原始数据(在文本文件中)和通过 GUI(Daily usage: 5:41:00 for Jul 21
)。统计数据还包括鼠标使用时间、鼠标移动距离、击键等内容。
从官方存储库安装它,将其添加到菜单栏,右键单击并选择“统计”。您将获得一个日历,可以选择您想要了解的日期。或者查看 ~/.workrave/historystats 中的数据
答案3
如果删除--profile,您将得到缺少时间戳的格式,但它确实表明屏幕保护程序是否处于活动状态。
$ dbus-monitor "type='signal',interface='org.gnome.ScreenSaver'
...
signal sender=:1.46 -> dest=(null destination) serial=1881 path=/org/gnome/ScreenSaver; interface=org.gnome.ScreenSaver; member=ActiveChanged
boolean true
我修改了这个 PHP 脚本,根据我的屏幕保护程序来激活或停用某些东西
#!/usr/bin/php
<?php
$handle = popen("dbus-monitor 'path=/org/gnome/ScreenSaver, member=ActiveChanged' 2>&1", 'r');
echo "'$handle'; " . gettype($handle) . "\n";
while (!feof($handle)) {
$read = fgets($handle);
if(preg_match("/^\s+boolean (\w+)/", $read, $matches))
{
$active = ($matches[1] == 'true');
// do something here
}
}
pclose($handle);
?>
另一个选项是使用gnome-screensaver-command --query
。使用 crontab,我让比特币在屏幕保护程序处于活动状态时使用所有 4 个核心,但当我使用计算机时它只获得 1 个核心。
DISPLAY=":0.0"
* * * * * if gnome-screensaver-command --query 2>&1 | grep -q 'is active'; then bitcoind setgenerate true 4; else bitcoind setgenerate true 1; fi
显示:如果不设置显示,gnome-screensaver-command 在从 cron 运行时将无法找到屏幕。这必须以相同的登录用户身份运行。
2>&1
:这会将所有错误直接发送到标准输出,然后由...捕获。
| grep -q 'is active';
:-q 使 grep 安静下来,它不输出任何内容。但命令会返回 if 使用的成功或失败信息。
我知道这些都不是完整的解决方案,但希望它们足以帮助您入门。
答案4
xprintidle - 实用程序打印用户在 X 中的空闲时间