Kiedy ekran jest zablokowany w KDE (moją specyficzną wersją jest Kubuntu, ale mam nadzieję, że jest to rodzajowy Linux), czy zdarzenie jest zarejestrowane? Jeśli tak, to gdzie mogę go znaleźć?
Kiedy ekran jest zablokowany w KDE (moją specyficzną wersją jest Kubuntu, ale mam nadzieję, że jest to rodzajowy Linux), czy zdarzenie jest zarejestrowane? Jeśli tak, to gdzie mogę go znaleźć?
Odpowiedzi:
Użyj D-Bus, aby uzyskać ekrany blokujące aktywowane / dezaktywowane sygnały. Nazwa usługi wygaszacza ekranu będzie się różnić w zależności od systemu. Ogólnie KDE używa org.freedesktop.ScreenSaver
i używa Gnome org.gnome.ScreenSaver
. Nie można na tym polegać, na przykład, używa Mint org.cinnamon.ScreenSaver
.
Pomocne polecenia
Zakładają, że wygaszacz ekranu jest org.freedesktop.ScreenSaver
a twoja usługa DBus jest org.freedesktop.DBus
. Może być konieczne dostosowanie tego ustawienia dla innych systemów. Użyj następujących informacji, aby dowiedzieć się, z czego korzysta Twój system:
Dostać lista usług dbus dostępne w bieżącej sesji, użyj:
dbus-send --session --dest=org.freedesktop.DBus --type=method_call --print-reply /org/freedesktop/DBus org.freedesktop.DBus.ListNames
Dodaj |grep screensaver
do końca, jeśli chcesz, aby dostępne były usługi wygaszacza ekranu.
Aby uzyskać listę poleceń obsługiwanych przez usługę wygaszacza ekranu, użyj:
qdbus org.freedesktop.ScreenSaver /ScreenSaver
Aby wywołać polecenie, użyj:
dbus-send --session --dest=org.freedesktop.ScreenSaver --type=method_call --print-reply --reply-timeout=20000 /org/freedesktop/ScreenSaver org.freedesktop.ScreenSaver.SetActive boolean:true
Gdzie SetActive
został wymieniony na liście obsługiwanych poleceń i przyjmuje wartość logiczną.
Aby monitorować usługę:
dbus-monitor --session "type='signal',interface='org.freedesktop.ScreenSaver'"
Automatyzacja
Teraz, gdy rozumiesz, jak działa twój system, możesz użyć skryptu Pythona, aby zarejestrować tę aktywność w pliku:
#!/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.freedesktop.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.freedesktop.ScreenSaver' in line:
running = 1
[ Źródło: rejestrowanie zdarzeń blokady ekranu ]
Nie jest logowany gdziekolwiek, ale jak powiedział @krowe, możesz się z nim połączyć.
Opracowałem ten skrypt basha, który opracowuje dla ciebie specyfikację twojego zestawu, jeśli masz uruchomiony w tle i przesyłasz go do pliku dziennika, będziesz miał swój dziennik.
#!/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
To działało dobrze w mojej Fedorze z KDE, ale myślę, że powinno działać na inne rzeczy, takie jak Debian z gnome et cetera.
Możesz mieć problemy, jeśli grep
nie obsługuje -P
(w takim przypadku możesz po prostu użyć sed
).