स्क्रीन लॉक / अनलॉक पर स्क्रिप्ट चलाएँ


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आपकी आवश्यकता के साथ।


हाय @peoro, जो मुझे लगता है कि आप एक पटकथा कार्यक्रम से सूक्ति स्क्रीन / सत्र को अनलॉक या लॉक कर सकते हैं, इसके बारे में कुछ ssh ट्रिक्स करने के लायक ;-)
निखिल मुल्ले

1
@ निखिल: ऐसा करने के लिए आपको डब के साथ खेलने की जरूरत नहीं है: gnome-screensaver-commandपहले से ही है। पास -aहोने पर gnome-screensaver-commandआप स्क्रीन को लॉक करेंगे, जबकि आप इसे अनलॉक करेंगे -d। वैसे भी ज्यादातर सूक्ति ऐप बड़े पैमाने पर डब का उपयोग करते हैं, इसलिए आप इसके साथ कई आश्चर्यजनक चीजें करने में सक्षम होंगे।
peoro

1
@peoro महान, बहुत उपयोगी धन्यवाद! क्या मैं इसे किसी प्रकार के डेमॉन के रूप में भी चला सकता हूं? जब मैं इसे अब टर्मिनल में दर्ज करता हूं, तो उस मामले के लिए डब की निगरानी के लिए खुला रहना पड़ता है। मैं लॉगिन पर इस कमांड को निष्पादित करना चाहता हूं और फिर यह पूरे सत्र के दौरान सक्रिय हो सकता है।
सैंडर

1
मुझे लगता है कि 2014 में चीजें बदल गई होंगी? क्योंकि आउटपुट केवल स्क्रीन लॉक होने पर परिवर्तित नहीं होता है, यह केवल कुछ दिखाता है जब यह खाली हो जाता है और यहाँ से बहुत अलग है :(, मैंने यह प्रश्न askubuntu.com/questions/505681/… से बनाया है , क्या आप मानते हैं कि अभी भी कुछ है ऐसा करने का तरीका? thx!
कुंभ राशि का पॉवर

उस स्क्रिप्ट को कैसे चलाया जाए कि वह लॉक ईवेंट को पकड़ ले? देखने वाले की तरह किंदा।
13

19

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
)

23 को यह काम कैसे करें?
रे फॉस

2
16.04 पर ठीक काम करता है
याकूब Vlijm

@JacobVlijm यह परीक्षण करने के लिए धन्यवाद और आज रात का उपयोग करने के लिए इसे हरी बत्ती के लिए :) :)
WinEunuuchs2Unix

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

उबंटू 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

यह एकता पर काम कर सकता है लेकिन सवाल गनोम के संबंध में था।
cprn

5

पहले से दिए गए उत्तर पर विस्तार करना।

यदि आप एक के अंदर से एक स्क्रिप्ट चलाने के लिए प्रयास करते हैं तो 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)

यदि यह आपके लिए काम नहीं करता है, तो शायद यह है:

  1. आप Gnome का उपयोग नहीं करते - बेहतर DBus घड़ी अभिव्यक्ति के लिए अन्य उत्तरों की जाँच करें।
  2. आप कई DBus लाइनों को चलाते हैं - पीआईडी ​​को निर्धारक खोजने के लिए कैसे करें पर विवरण देखें

1
यह वास्तव में एक अलग सवाल का जवाब देता है जो मैंने DBus सत्र की जानकारी की खोज के लिए एक उपयोगकर्ता खाता दिया था, जिसे मैंने यहां हल किया है । आपके योगदान के लिए यहाँ धन्यवाद!
Naftuli Kay

धन्यवाद। मैं आपके समाधान को आगे पढ़ने के लिए उत्तर में दूंगा।
cprn

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
आप केडीई / प्लाज्मा का उपयोग यदि आप सूचनाएं आलेख निष्पादित करने के प्लाज्मा डेस्कटॉप सेटिंग्स का उपयोग कर सकते हैं ... Personalization>Notifications>Notifications>Screensaver
xenoid

धन्यवाद @xenoid! केडीई एक ऐसा व्यक्तिगत डी है जिसे आपको इन चीजों के साथ कभी नहीं करना है। इसके रूप में अगर वे आशा करते हैं कि मुझे क्या चाहिए
अंकुर एस

0

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

-1

यह मेरे लिए 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

यह मेरे लिए काम नहीं किया। जैसा कि इसने क्रियान्वित किया और राज्य की नहीं सुनी, बदल गया।
Starx

आप किस स्क्रीन सेवर का उपयोग कर रहे हैं? सूक्ति या xscreensaver? कौन सा स्वाद ubuntu, xubuntu, kubuntu आदि जो संस्करण (यह 16.04 पर परीक्षण किया गया था)
ozma

ubuntu gnome 16.04
9
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.