Tôi muốn chạy một màn hình nếu phiên Gnome bị khóa và mở khóa. Có cách nào để tôi có thể chặn điều này và thực hiện một số hành động nhất định khi máy tính để bàn bị khóa hoặc mở khóa không?
Tôi muốn chạy một màn hình nếu phiên Gnome bị khóa và mở khóa. Có cách nào để tôi có thể chặn điều này và thực hiện một số hành động nhất định khi máy tính để bàn bị khóa hoặc mở khóa không?
Câu trả lời:
Gnome-Screensaver phát ra một số tín hiệu trên dbus khi có điều gì đó xảy ra.
Đây là tài liệu (với một số ví dụ).
Bạn có thể viết một tập lệnh chạy:
dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'"
và đó là những gì bạn cần bất cứ lúc nào dbus-monitorin một dòng về màn hình bị khóa / mở khóa.
Đây là một lệnh bash để làm những gì bạn cần:
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
Chỉ cần thay thế echo SCREEN_LOCKEDvà echo SCREEN_UNLOCKEDvới những gì bạn cần.
gnome-screensaver-commandđã có sẵn. Chuyển -ađến gnome-screensaver-commandbạn sẽ khóa màn hình, trong khi bạn sẽ mở khóa bằng -d. Dù sao, hầu hết các ứng dụng gnome đều sử dụng dbus rộng rãi, vì vậy bạn sẽ có thể làm nhiều điều tuyệt vời với nó.
Trong phiên bản Ubuntu 14.04, sự kiện DBus để mở khóa khóa màn hình đã thay đổi và tập lệnh mới để liên kết với khóa màn hình và mở khóa các sự kiện giống như sau
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
)
Ngày nay tôi nghĩ tốt hơn là nên nghe những LockedHinttin nhắn thay vì bảo vệ màn hình. Bằng cách đó, bạn không bị ràng buộc với việc thực hiện bảo vệ màn hình.
Đây là một kịch bản đơn giản để làm điều đó:
gdbus monitor -y -d org.freedesktop.login1 | grep LockedHint
Đưa ra điều này:
/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: giải pháp của ozma không hiệu quả với tôi, tuy nhiên giải pháp này đã làm:
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
Mở rộng về câu trả lời đã được đưa ra.
Nếu bạn cố chạy tập lệnh từ bên trong một phiên screenhoặc tmuxphiên, bạn sẽ cần tìm chính xác $DBUS_SESSION_BUS_ADDRESStrước và chuyển nó thành đối số dbus-monitorthay vì --session. Ngoài ra, nếu bạn đang chạy nó như một daemon, bạn nên đảm bảo chỉ có một phiên bản đang chạy tại một thời điểm (ví dụ: với một tệp khóa) và tập lệnh sẽ tự dọn sạch trap. Ví dụ sau sẽ hoạt động như một trình nền trong hầu hết các môi trường Gnome hiện tại (được thử nghiệm trên 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)
Nếu điều này không phù hợp với bạn, có lẽ là vì:
Nếu bạn đang sử dụng Kubfox hoặc sử dụng KDE / Plasma làm Môi trường máy tính để bàn, bạn phải lắng nghe giao diện org.freedesktop.ScreenSaver, do đó, tập lệnh để nghe sự kiện đó sẽ như thế này:
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 phiên hỗ trợ công việcdesktop-lock và desktop-unlockcác sự kiện trong khổ start onthơ. Chỉ cần tạo một công việc .conf cho người dùng của bạn bằng các trình kích hoạt và lệnh có liên quan để gọi theo $XDG_CONFIG_HOME/upstart/hoặc $HOME/.config/upstartví dụ dưới đây:
description "some job description"
start on desktop-lock
script
/path/to/your/executable
end script
đây là những gì làm việc cho tôi trong 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