Gnome oturumu kilitlenmiş ve kilidi açılmışsa bir ekran çalıştırmak istiyorum. Masaüstü kilitlendiğinde veya kilidi açıldığında bunu engelleyebileceğim ve belirli işlemler yapabileceğim bir yol var mı?
Gnome oturumu kilitlenmiş ve kilidi açılmışsa bir ekran çalıştırmak istiyorum. Masaüstü kilitlendiğinde veya kilidi açıldığında bunu engelleyebileceğim ve belirli işlemler yapabileceğim bir yol var mı?
Yanıtlar:
GNOME ekran koruyucu bir şey olduğunda dbus'ta bazı sinyaller yayar.
İşte belgeler (bazı örneklerle).
Çalışan bir komut dosyası yazabilirsiniz:
dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'"
ve ihtiyacınız olanı yaparsanız dbus-monitor
, kilitlenen / kilidi açılan ekran hakkında bir çizgi basar.
İhtiyacınız olanı yapmak için burada bir bash komutu:
dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" |
while read x; do
case "$x" in
*"boolean true"*) echo SCREEN_LOCKED;;
*"boolean false"*) echo SCREEN_UNLOCKED;;
esac
done
Sadece yerine echo SCREEN_LOCKED
ve echo SCREEN_UNLOCKED
gerekenler ile.
gnome-screensaver-command
zaten orada. Geçme -a
için gnome-screensaver-command
sizinle kilidini açacağız satarken, Ekranı kilitlemek edeceğiz -d
. Her neyse, çoğu cüce uygulaması dbus'ı yaygın olarak kullanıyor, böylece onunla çok şaşırtıcı şeyler yapabilirsiniz.
Ubuntu 14.04'te, ekran kilidi kilidinin açılması için DBus etkinliği değişmiştir ve ekran kilidinin açılması ve kilidinin açılması için yeni komut aşağıdaki gibidir.
dbus-monitor --session "type='signal',interface='com.ubuntu.Upstart0_6'" | \
(
while true; do
read X
if echo $X | grep "desktop-lock" &> /dev/null; then
SCREEN_LOCKED;
elif echo $X | grep "desktop-unlock" &> /dev/null; then
SCREEN_UNLOCKED;
fi
done
)
Bugünlerde LockedHint
ekran koruyucu mesajları yerine dinlemenin daha iyi olacağını düşünüyorum . Bu şekilde bir ekran koruyucu uygulamasına bağlı değilsiniz.
İşte bunu yapmak için basit bir komut dosyası:
gdbus monitor -y -d org.freedesktop.login1 | grep LockedHint
Bunu verir:
/org/freedesktop/login1/session/_32: org.freedesktop.DBus.Properties.PropertiesChanged ('org.freedesktop.login1.Session', {'LockedHint': <true>}, @as [])
/org/freedesktop/login1/session/_32: org.freedesktop.DBus.Properties.PropertiesChanged ('org.freedesktop.login1.Session', {'LockedHint': <false>}, @as [])
Ubuntu 16.04: ozma'nın çözümü benim için işe yaramadı, ancak bu yaptı:
dbus-monitor --session "type=signal,interface=com.canonical.Unity.Session,member=Unlocked" |
while read MSG; do
LOCK_STAT=`echo $MSG | awk '{print $NF}'`
if [[ "$LOCK_STAT" == "member=Unlocked" ]]; then
echo "was unlocked"
fi
done
Zaten verilen cevap genişleyerek.
Bir komut dosyasını bir screen
veya tmux
oturumun içinden çalıştırmayı denerseniz , önce doğru olanı bulmanız $DBUS_SESSION_BUS_ADDRESS
ve dbus-monitor
bunun yerine bir argüman olarak geçirmeniz gerekir --session
. Ayrıca bir arka plan programı olarak çalıştırıyorsanız, bir kerede yalnızca bir örneğin çalıştığından (örn. Bir kilit dosyasıyla) ve komut dosyasının kendisinden sonra temizlediğinden emin olmalısınız trap
. Aşağıdaki örnek, en güncel Gnome ortamlarında (- Ubuntu GNOME 16.04'te test edilmiştir) daemon olarak çalışacaktır:
#!/bin/bash
set -o nounset # good practice, exit if unset variable used
pidfile=/tmp/lastauth.pid # lock file path
logfile=/tmp/lastauth.log # log file path
cleanup() { # when cleaning up:
rm -f $pidfile # * remove the lock file
trap - INT TERM EXIT # * reset kernel signal catching
exit # * stop the daemon
}
log() { # simple logging format example
echo $(date +%Y-%m-%d\ %X) -- $USER -- "$@" >> $logfile
}
if [ -e "$pidfile" ]; then # if lock file exists, exit
log $0 already running...
exit
fi
trap cleanup INT TERM EXIT # call cleanup() if e.g. killed
log daemon started...
echo $$ > $pidfile # create lock file with own PID inside
# usually `dbus-daemon` address can be guessed (`-s` returns 1st PID found)
export $(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pidof -s dbus-daemon)/environ)
expr='type=signal,interface=org.gnome.ScreenSaver' # DBus watch expression here
dbus-monitor --address $DBUS_SESSION_BUS_ADDRESS "$expr" | \
while read line; do
case "$line" in
*"boolean true"*) log session locked;;
*"boolean false"*) log session unlocked;;
esac
done
cleanup # let's not leave orphaned lock file when the loop ends (e.g. dbus dies)
Bu sizin için işe yaramazsa, muhtemelen çünkü:
Kubuntu'daysanız veya Masaüstü Ortamınız olarak KDE / Plazma kullanıyorsanız, arayüzü dinlemek zorundasınız org.freedesktop.ScreenSaver
, böylece o olayı dinlemek için kullanılan komut dosyası şöyle görünecektir:
dbus-monitor --session "type='signal',interface='org.freedesktop.ScreenSaver'" |
while read x; do
case "$x" in
*"boolean true"*) echo SCREEN_LOCKED;;
*"boolean false"*) echo SCREEN_UNLOCKED;;
esac
done
Personalization>Notifications>Notifications>Screensaver
.
upstart
oturum iş destek desktop-lock
ve stanza desktop-unlock
olayları start on
. Kullanıcınız için aşağıdaki örnek altında $XDG_CONFIG_HOME/upstart/
veya $HOME/.config/upstart
benzeri bir şekilde çağırması gereken ilgili tetikleyiciler ve komutlarla bir iş .conf oluşturun :
description "some job description"
start on desktop-lock
script
/path/to/your/executable
end script
bu benim için çalıştı ubuntu'da çalıştı 16.04
dbus-monitor --session "type=signal,interface=org.gnome.ScreenSaver" |
while read MSG; do
LOCK_STAT=`echo $MSG | grep boolean | awk '{print $2}'`
if [[ "$LOCK_STAT" == "true" ]]; then
echo "was locked"
else
echo "was un-locked"
fi
done