Answers:
这是使用“ dbus-monitor”的另一种解决方案。一些bash脚本记录屏幕活动。
exit_report(){
echo "$(date) Monitoring Terminated."
}
trap "exit_report; exit;" 0
lockmon() {
adddate() {
while IFS= read -r line; do
echo "$(date) $line" | grep "boolean" | sed 's/ boolean true/Screen Locked/' | sed 's/ boolean false/Screen Unlocked/'
done
}
echo "$(date) Monitoring Started."
dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" | adddate
}
lockmon >> lock_screen.log
是的,似乎没有为您记录任何地方。@tutuDajuju有一个很好的解决方案,所以我想对有兴趣的人将其移植到bash(并消除对使用gnome的依赖,无论桌面环境如何都可以使用)。
如果您在后台运行此程序并将其通过管道传输到日志文件,则将拥有您的日志。
#!/bin/bash
#prints out, among other things;
# string "org.kde.screensaver"
#transform it to 'org.kde.screensaver'
service=$(\
dbus-send \
--session \
--dest=org.freedesktop.DBus \
--type=method_call \
--print-reply \
/org/freedesktop/DBus org.freedesktop.DBus.ListNames \
| grep -o '[^"]*.screensaver'
)
#prints out, among other things;
#method bool org.freedesktop.ScreenSaver.SetActive(bool e)
#transform it to 'org.freedesktop.ScreenSaver'
interface=$(
qdbus \
$service /ScreenSaver \
| grep -oP '[^ ]*(?=.SetActive)'
)
path='/ScreenSaver'
#monitor it with a while loop
dbus-monitor "type='signal',interface='$interface',member='ActiveChanged',path='$path'" \
| while read -r line; do
#ignore the metadata and pull the 'boolean <true/false>' line
read line
#check if it is set to true
if echo $line | grep -q 'true'; then
echo "Locked at $(date)"
else
echo "Unlocked at $(date)"
fi
done
这在使用KDE的Fedora上运行得很好,但是我想它应该可以在其他类似gnome et cetera的Debian上使用。
如果您grep
不支持-P
,则可能会遇到问题(在这种情况下,您可以使用sed
)。
也可以回答这个问题,尽管这不是我的答案(老板为我提供了解决方案)来帮助有相同需求(或好奇心)的其他人。
tl; dr:使用D-Bus获取锁屏的激活/停用信号。
似乎GNOME应用程序(尤其是ScreenSaver应用程序)广泛支持D-Bus消息传递,并且gnome-screensaver应用程序似乎是Gnome shell的官方锁定应用程序。
因此,为了进行测试,我只运行了dbus-monitor并获得了响应:
dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'"
我已经编写了一些python脚本来将该活动记录到文件中:
#!/usr/bin/env python
from datetime import datetime
import os
import pwd
import subprocess
import time
LOG_FILE = os.path.expanduser('~/hours_log.csv')
cmd = subprocess.Popen(["dbus-monitor \"type='signal',interface="
"'org.gnome.ScreenSaver'\""], shell=True,
stdout=subprocess.PIPE)
running = 0
while 1:
time.sleep(0.1)
if running:
output = cmd.stdout.readline()
status = 'unlocked' if 'true' in output else 'locked'
new_line = "{time} {user} {status} the screen\n".format(
time=datetime.now().ctime(),
user=pwd.getpwuid(os.getuid())[0],
status=status
)
with open(LOG_FILE, 'a') as f:
f.write(new_line)
running = 0
line = cmd.stdout.readline()
if "ActiveChange" in line and 'org.gnome.ScreenSaver' in line:
running = 1
您正在使用哪个屏幕保护程序?如果是xscreensaver,请打开日志选项并尝试监视日志文件。
.sh
文件中,并将其添加到Gnome的启动应用程序中。会在锡罐上说什么-thros