Saya ingin menjalankan layar jika sesi Gnome terkunci dan tidak terkunci. Apakah ada cara saya dapat mencegat ini dan melakukan tindakan tertentu ketika desktop terkunci atau tidak terkunci?
Saya ingin menjalankan layar jika sesi Gnome terkunci dan tidak terkunci. Apakah ada cara saya dapat mencegat ini dan melakukan tindakan tertentu ketika desktop terkunci atau tidak terkunci?
Jawaban:
Gnome-screensaver memancarkan beberapa sinyal pada dbus ketika sesuatu terjadi.
Berikut dokumentasi (dengan beberapa contoh).
Anda dapat menulis skrip yang berjalan:
dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'"
dan itu melakukan apa yang Anda butuhkan kapan saja dbus-monitor
mencetak garis tentang layar sedang dikunci / dibuka.
Di sini perintah bash untuk melakukan apa yang Anda butuhkan:
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
Ganti saja echo SCREEN_LOCKED
dan echo SCREEN_UNLOCKED
dengan apa yang Anda butuhkan.
gnome-screensaver-command
sudah ada di sana. Melewati -a
ke gnome-screensaver-command
Anda akan mengunci layar, sementara Anda akan membukanya dengan -d
. Bagaimanapun, sebagian besar aplikasi gnome menggunakan dbus secara luas, sehingga Anda dapat melakukan banyak hal menakjubkan dengannya.
Di ubuntu 14.04 acara DBus untuk membuka kunci layar telah berubah dan skrip baru untuk mengikat ke kunci layar dan membuka kunci acara tampak seperti berikut
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
)
Saat ini saya pikir lebih baik mendengarkan LockedHint
pesan daripada screensaver. Dengan begitu Anda tidak terikat dengan implementasi screensaver.
Berikut ini skrip sederhana untuk melakukannya:
gdbus monitor -y -d org.freedesktop.login1 | grep LockedHint
Memberi ini:
/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: solusi ozma tidak bekerja untuk saya, namun yang ini berhasil:
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
Memperluas jawaban yang sudah diberikan.
Jika Anda mencoba menjalankan skrip dari dalam sesi screen
atau tmux
, Anda harus menemukan yang benar $DBUS_SESSION_BUS_ADDRESS
terlebih dahulu dan meneruskannya sebagai argumen untuk dbus-monitor
bukan --session
. Juga jika Anda menjalankannya sebagai daemon, Anda harus memastikan hanya satu instance yang berjalan pada satu waktu (misalnya dengan file kunci) dan bahwa skrip membersihkan setelah itu dengan trap
. Contoh berikut akan berfungsi sebagai daemon di sebagian besar lingkungan Gnome saat ini (diuji pada Ubuntu GNOME 16.04):
#!/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)
Jika ini tidak berhasil untuk Anda, mungkin karena:
Jika Anda menggunakan Kubuntu atau menggunakan KDE / Plasma sebagai Lingkungan Desktop Anda, Anda harus mendengarkan antarmuka org.freedesktop.ScreenSaver
, sehingga skrip untuk mendengarkan acara tersebut akan terlihat seperti ini:
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
dukungan sesi pekerjaandesktop-lock
dan desktop-unlock
acara dalam start on
bait. Cukup buat pekerjaan .conf untuk pengguna Anda dengan pemicu dan perintah yang relevan untuk dipanggil di bawah $XDG_CONFIG_HOME/upstart/
atau $HOME/.config/upstart
seperti contoh di bawah ini:
description "some job description"
start on desktop-lock
script
/path/to/your/executable
end script
inilah yang bekerja untuk saya di ubuntu 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