ฉันต้องการเรียกใช้หน้าจอหากเซสชัน Gnome ถูกล็อกและปลดล็อค มีวิธีที่ฉันสามารถดักจับสิ่งนี้และดำเนินการบางอย่างเมื่อเดสก์ท็อปถูกล็อกหรือปลดล็อกหรือไม่?
ฉันต้องการเรียกใช้หน้าจอหากเซสชัน Gnome ถูกล็อกและปลดล็อค มีวิธีที่ฉันสามารถดักจับสิ่งนี้และดำเนินการบางอย่างเมื่อเดสก์ท็อปถูกล็อกหรือปลดล็อกหรือไม่?
คำตอบ:
Gnome-screensaver ส่งสัญญาณบางอย่างไปยัง dbus เมื่อมีบางอย่างเกิดขึ้น
นี่คือเอกสารประกอบ (พร้อมตัวอย่าง)
คุณสามารถเขียนสคริปต์ที่ทำงาน:
dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'"
และทำสิ่งที่คุณต้องการได้ตลอดเวลาdbus-monitor
พิมพ์บรรทัดเกี่ยวกับหน้าจอที่ถูกล็อค / ปลดล็อค
นี่คือคำสั่ง bash ที่จะทำสิ่งที่คุณต้องการ:
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
เพียงแค่เปลี่ยนecho SCREEN_LOCKED
และecho SCREEN_UNLOCKED
มีสิ่งที่คุณต้องการ
gnome-screensaver-command
มีอยู่แล้ว ผ่าน-a
ไปคุณจะล็อคหน้าจอในขณะที่คุณจะปลดล็อคด้วยgnome-screensaver-command
-d
อย่างไรก็ตามแอปคำพังเพยส่วนใหญ่ใช้ dbus อย่างกว้างขวางดังนั้นคุณจะสามารถทำสิ่งที่น่าอัศจรรย์มากมายได้
ใน Ubuntu 14.04 เหตุการณ์ DBus สำหรับการล็อกการล็อกหน้าจอมีการเปลี่ยนแปลงและสคริปต์ใหม่สำหรับการเชื่อมโยงกับการล็อกหน้าจอและการปลดล็อกเหตุการณ์มีลักษณะดังต่อไปนี้
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
)
ทุกวันนี้ฉันคิดว่ามันเป็นการดีที่จะฟังLockedHint
มากกว่าข้อความสกรีนเซฟเวอร์ ด้วยวิธีนี้คุณไม่ได้ผูกติดอยู่กับการใช้งานสกรีนเซฟเวอร์
นี่เป็นสคริปต์ง่ายๆที่จะทำ:
gdbus monitor -y -d org.freedesktop.login1 | grep LockedHint
ให้สิ่งนี้:
/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 ไม่ได้ผลสำหรับฉัน แต่อันนี้ทำ:
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
การขยายคำตอบที่ได้รับแล้ว
ถ้าคุณพยายามที่จะเรียกใช้สคริปต์จากภายในได้screen
หรือtmux
เซสชั่นที่คุณจะต้องไปหาที่ถูกต้อง$DBUS_SESSION_BUS_ADDRESS
ครั้งแรกและผ่านมันเป็นอาร์กิวเมนต์สำหรับแทนdbus-monitor
--session
นอกจากนี้ถ้าคุณใช้มันเป็น daemon คุณควรตรวจสอบให้แน่ใจเพียงหนึ่งตัวอย่างทำงานที่เวลา (เช่นกับแฟ้มล็อค) trap
และว่าสคริปต์ทำความสะอาดขึ้นหลังจากที่ตัวเองด้วย ตัวอย่างต่อไปนี้จะทำงานเป็น daemon ในสภาพแวดล้อม Gnome ล่าสุด (ทดสอบบน 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)
หากสิ่งนี้ไม่ได้ผลสำหรับคุณอาจเป็นเพราะ:
หากคุณใช้ Kubuntu หรือใช้ KDE / Plasma เป็นเดสก์ท็อปของคุณคุณต้องฟังอินเทอร์เฟซorg.freedesktop.ScreenSaver
ดังนั้นสคริปต์สำหรับฟังเหตุการณ์นั้นจะมีลักษณะดังนี้:
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
การสนับสนุนงานเซสชันdesktop-lock
และdesktop-unlock
กิจกรรมในstart on
stanza เพียงแค่สร้างงาน. ยืนยันสำหรับผู้ใช้ของคุณด้วยทริกเกอร์และคำสั่งที่เกี่ยวข้องในการโทร$XDG_CONFIG_HOME/upstart/
หรือ$HOME/.config/upstart
ตัวอย่างด้านล่าง:
description "some job description"
start on desktop-lock
script
/path/to/your/executable
end script
นี่คือสิ่งที่ใช้ได้กับฉันใน 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