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-monitor
in 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_LOCKED
và echo SCREEN_UNLOCKED
với những gì bạn cần.
gnome-screensaver-command
đã có sẵn. Chuyển -a
đến gnome-screensaver-command
bạ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 LockedHint
tin 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 screen
hoặc tmux
phiên, bạn sẽ cần tìm chính xác $DBUS_SESSION_BUS_ADDRESS
trước và chuyển nó thành đối số dbus-monitor
thay 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-unlock
các sự kiện trong khổ start on
thơ. 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/upstart
ví 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