স্ক্রিন লক / আনলক এ স্ক্রিপ্ট চালান


54

জিনোম সেশনটি লক করা এবং আনলক করা থাকলে আমি একটি পর্দা চালাতে চাই। ডেস্কটপ লক করা বা আনলক করা থাকা অবস্থায় আমি কী এটিকে আটকাতে এবং নির্দিষ্ট ক্রিয়া সম্পাদন করতে পারি?

উত্তর:


49

জেনোম-স্ক্রিনসেভার যখন কিছু ঘটে তখন ডিবিাসে কিছু সংকেত প্রেরণ করে।

এখানে ডকুমেন্টেশন (কয়েকটি উদাহরণ সহ)।

আপনি চালাতে পারে এমন একটি স্ক্রিপ্ট লিখতে পারেন:

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আপনার যা প্রয়োজন তা দিয়ে দিন।


হাই @ স্পিরো, এটি আমাকে মনে করে যে আপনি কোনও স্ক্রিপ্টেড প্রোগ্রাম থেকে জিনোম স্ক্রিন / সেশন আনলক করতে বা লক করতে পারবেন, এটি সম্পর্কে কিছু ssh কৌশলগুলি করার জন্য ;-)
নিখিল মুলি

1
@ নিখিল: এটি করার জন্য আপনাকে ডিবিাসের সাথে খেলতে হবে না: gnome-screensaver-commandইতিমধ্যে রয়েছে। পাসিং -aকরতে gnome-screensaver-commandআপনি, স্ক্রীন লক যখন আপনি এটি দিয়ে আনলক করব করব -d। যাইহোক, বেশিরভাগ জিনোম অ্যাপ্লিকেশনগুলি ডিবাসকে ব্যাপকভাবে ব্যবহার করে, তাই আপনি এটি দিয়ে অনেক আশ্চর্যজনক কাজ করতে সক্ষম হবেন।
পেরো

1
@ পেওরো ধন্যবাদ দুর্দান্ত, খুব সহায়ক! আমি কি এটি কোনও ধরণের ডিমন হিসাবে চালাতে পারি? আমি এখন এটি টার্মিনালে প্রবেশ করার পরে, সেই ক্ষেত্রে ডিবিস নিরীক্ষণের জন্য এটি খোলা থাকতে হবে। আমি লগইন করে এই কমান্ডটি কার্যকর করতে চাই এবং তারপরে এটি পুরো সেশনের সময় সক্রিয় হতে পারে।
স্যান্ডার

1
আমি মনে করি 2014 সালে এখন জিনিসগুলি পরিবর্তিত হতে পারে? স্ক্রিনটি শুধুমাত্র লক থাকলে আউটপুট পরিবর্তিত হয় না, এটি ফাঁকা হয়ে গেলে কেবল কিছু দেখায় এবং এখান থেকে খুব আলাদা :(, আমি এই প্রশ্নটি জিজ্ঞাসা করেছিলাম জিজ্ঞাসুবন্টু / প্রশ্ন / 505681/… , আপনি কি বিশ্বাস করেন যে এখনও কিছু আছে? এটি করার উপায়? THX!
অ্যাকোরিয়াস পাওয়ার

কীভাবে স্ক্রিপ্টটি চালাবেন যে এটি লক ইভেন্টটি ধরে? প্রহরী মত কিন্দা।
স্টারেক্স

19

উবুন্টু ১৪.০৪-এ স্ক্রিন লক আনলকের জন্য ডিবাস ইভেন্টটি পরিবর্তিত হয়েছে এবং স্ক্রিন লক এবং আনলক ইভেন্টগুলিকে আবদ্ধ করার জন্য নতুন স্ক্রিপ্টটি নীচের মত দেখাচ্ছে

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
)

ফেডোরা 23 এ এই কাজটি কিভাবে করবেন সে সম্পর্কে ধারণাগুলি?
রায় ফস

2
16.04-
তেও

@ জ্যাকবভিলিজম আজকের রাতে এটি ব্যবহার করার জন্য এটি পরীক্ষা করার জন্য এবং এটি সবুজ আলো জ্বালানোর জন্য ধন্যবাদ :)
উইনউনুছস

6

আজকাল আমি মনে করি 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 [])

5

উবুন্টু ১.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

এটি ইউনিটিতে কাজ করতে পারে তবে জিনোমের বিষয়ে প্রশ্ন ছিল।
সিআরপিএন

5

ইতিমধ্যে প্রদত্ত উত্তরের উপর সম্প্রসারণ করা হচ্ছে।

আপনি যদি কোনও অধিবেশন 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)

যদি এটি আপনার পক্ষে কাজ করে না, তবে সম্ভবত:

  1. আপনি জ্নোম ব্যবহার করবেন না - আরও ভাল ডিবিস ওয়াচ এক্সপ্রেশনটির জন্য অন্যান্য উত্তরগুলি পরীক্ষা করুন।
  2. আপনি একাধিক ডিবিস লাইন পরিচালনা করেন - পিআইডি কীভাবে নির্ণায়ককে কীভাবে তৈরি করবেন সে সম্পর্কে বিশদটি পরীক্ষা করে দেখুন

1
এটি একটি পৃথক প্রশ্নের উত্তর দেয় যা আমি ইউজার অ্যাকাউন্টে প্রদত্ত ডিবিবাস সেশন তথ্যটি গতিশীলভাবে আবিষ্কার করার জন্য পেয়েছিলাম, যা আমি এখানে সমাধান করেছি । আপনার অবদানের জন্য এখানে ধন্যবাদ!
নাফটুলি কে

ধন্যবাদ। আমি আরও পড়ার জন্য উত্তরে আপনার সমাধানটি যুক্ত করব।
সিআরপিএন

4

আপনি যদি কুবুন্টুতে থাকেন বা আপনার ডেস্কটপ এনভায়রনমেন্ট হিসাবে কেডিএ / প্লাজমা ব্যবহার করছেন, আপনাকে ইন্টারফেসের 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

1
KDE দ্বারা / প্লাজমা ব্যবহার করেন তাহলে আপনাকে বিজ্ঞপ্তি উপর স্ক্রিপ্ট চালানো প্লাজমা ডেস্কটপ সেটিংস ব্যবহার করতে পারেন ... Personalization>Notifications>Notifications>Screensaver
xenoid

ধন্যবাদ @ এক্সনয়েড! কেডিএ এমন একটি ব্যক্তিগতকরণযোগ্য ডি যে আপনাকে কখনই এই জিনিসগুলির সাথে ঝাঁকুনি দিতে হবে না। এটি যেন তারা আমার যা প্রয়োজন তা অনুমান করে
অঙ্কুর এস

0

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

-1

এটি আমার জন্য উবুন্টু 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

এটি আমার পক্ষে কাজ করে না। যেহেতু এটি সম্পাদন শেষ হয়েছে এবং শুনতে পেল না রাষ্ট্রের পরিবর্তন হয়েছে।
স্টারেক্স

আপনি কোন স্ক্রিন সেভার ব্যবহার করছেন? জিনোম বা এক্সস্ক্রিনসেভার? কোন স্বাদটি উবুন্টু, জুবুন্টু, কুবুন্টু ইত্যাদি কোন সংস্করণ (এটি 16.04 এ পরীক্ষা করা হয়েছিল)
ওজমা

উবুন্টু জিনোম 16.04
স্টারেক্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.