জিনোম সেশনটি লক করা এবং আনলক করা থাকলে আমি একটি পর্দা চালাতে চাই। ডেস্কটপ লক করা বা আনলক করা থাকা অবস্থায় আমি কী এটিকে আটকাতে এবং নির্দিষ্ট ক্রিয়া সম্পাদন করতে পারি?
জিনোম সেশনটি লক করা এবং আনলক করা থাকলে আমি একটি পর্দা চালাতে চাই। ডেস্কটপ লক করা বা আনলক করা থাকা অবস্থায় আমি কী এটিকে আটকাতে এবং নির্দিষ্ট ক্রিয়া সম্পাদন করতে পারি?
উত্তর:
জেনোম-স্ক্রিনসেভার যখন কিছু ঘটে তখন ডিবিাসে কিছু সংকেত প্রেরণ করে।
এখানে ডকুমেন্টেশন (কয়েকটি উদাহরণ সহ)।
আপনি চালাতে পারে এমন একটি স্ক্রিপ্ট লিখতে পারেন:
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
। যাইহোক, বেশিরভাগ জিনোম অ্যাপ্লিকেশনগুলি ডিবাসকে ব্যাপকভাবে ব্যবহার করে, তাই আপনি এটি দিয়ে অনেক আশ্চর্যজনক কাজ করতে সক্ষম হবেন।
উবুন্টু ১৪.০৪-এ স্ক্রিন লক আনলকের জন্য ডিবাস ইভেন্টটি পরিবর্তিত হয়েছে এবং স্ক্রিন লক এবং আনলক ইভেন্টগুলিকে আবদ্ধ করার জন্য নতুন স্ক্রিপ্টটি নীচের মত দেখাচ্ছে
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 [])
উবুন্টু ১.0.০৪: ওজমার সমাধানটি আমার পক্ষে কার্যকর হয়নি, তবে এইটি এটি করেছে:
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.০৪-তে পরীক্ষা করা):
#!/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
। নীচের উদাহরণের নীচে $XDG_CONFIG_HOME/upstart/
বা এর $HOME/.config/upstart
মতো কল করার জন্য প্রাসঙ্গিক ট্রিগার এবং কমান্ড সহ আপনার ব্যবহারকারীর জন্য কেবল একটি কাজ তৈরি করুন con
description "some job description"
start on desktop-lock
script
/path/to/your/executable
end script
এটি আমার জন্য উবুন্টু 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