यदि ग्नोम सत्र लॉक और अनलॉक किया गया है तो मैं एक स्क्रीन चलाना चाहता हूं। क्या कोई ऐसा तरीका है जिससे मैं इसे रोक सकता हूं और कुछ क्रियाओं को कर सकता हूं जब डेस्कटॉप लॉक या अनलॉक किया गया हो?
यदि ग्नोम सत्र लॉक और अनलॉक किया गया है तो मैं एक स्क्रीन चलाना चाहता हूं। क्या कोई ऐसा तरीका है जिससे मैं इसे रोक सकता हूं और कुछ क्रियाओं को कर सकता हूं जब डेस्कटॉप लॉक या अनलॉक किया गया हो?
जवाबों:
गनोम-स्क्रीनसेवर कुछ होने पर डब के कुछ संकेतों का उत्सर्जन करता है।
यहाँ प्रलेखन (कुछ उदाहरणों के साथ)।
आप एक स्क्रिप्ट लिख सकते हैं जो चलती है:
dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'"
और इससे आपको कभी भी dbus-monitor
स्क्रीन के लॉक होने / अनलॉक होने के बारे में एक लाइन प्रिंट करने की आवश्यकता होती है।
यहाँ एक बैश करने की आज्ञा है जो आपको चाहिए:
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
। वैसे भी ज्यादातर सूक्ति ऐप बड़े पैमाने पर डब का उपयोग करते हैं, इसलिए आप इसके साथ कई आश्चर्यजनक चीजें करने में सक्षम होंगे।
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 [])
उबंटू 16.04: ओजमा का समाधान मेरे लिए काम नहीं करता था, हालांकि इसने ऐसा किया:
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
। इसके अलावा अगर आप इसे एक डेमन के रूप में चला रहे हैं, तो आपको यह सुनिश्चित करना चाहिए कि एक समय में केवल एक ही उदाहरण चल रहा है (जैसे कि लॉक फ़ाइल के साथ) और यह स्क्रिप्ट अपने आप से साफ हो जाती है trap
। निम्नलिखित उदाहरण सबसे मौजूदा सूक्ति वातावरण (उबुन्टो ग्नोम 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)
यदि यह आपके लिए काम नहीं करता है, तो शायद यह है:
यदि आप कुबंटु पर हैं या अपने डेस्कटॉप पर्यावरण के रूप में केडीई / प्लाज्मा का उपयोग कर रहे हैं, तो आपको इंटरफ़ेस के 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
। बस प्रासंगिक चलाता के साथ अपने उपयोगकर्ता के लिए एक नौकरी .conf बना सकते हैं और के तहत कॉल करने के लिए आदेश $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