फिर से शुरू और स्क्रीन अनलॉक करने के बाद स्क्रिप्ट कैसे चलाएं


14

उबंटू 12.04 एलटीएस में, मैं सस्पेंड से फिर से शुरू करने और अपने डेस्कटॉप को अनलॉक करने के बाद स्क्रिप्ट चलाना चाहूंगा। इन्हें मेरे उपयोगकर्ता के रूप में चलाने की आवश्यकता है, और मेरी पहुँच के साथ $DISPLAY

विशेष रूप से, मैं चाहूंगा

  • बग 985028 केnm-applet आसपास काम करने के लिए पुनः आरंभ
  • एक कस्टम अधिसूचना का उपयोग कर दिखाओ notify-send
  • संभवत: अन्य सामान जब मुझे ये काम मिलेंगे

जब मैं फिर से शुरू करता हूं, तो स्क्रिप्ट /etc/pm/sleep.d/चलती हैं, लेकिन वे मेरी स्क्रीन और उपयोगकर्ता नाम के ज्ञान के बिना, रूट के रूप में चलती हैं। यह काम कर सकता है यदि मैं अपने उपयोगकर्ता नाम और इन लिपियों में exportडिफ़ॉल्ट DISPLAY :0को हार्ड-कोड करता हूं , लेकिन यह बहुत बदसूरत हैक की तरह लगता है।

में स्क्रिप्ट पर ~/.config/autostart/xyz.desktopप्रवेश के बाद रन है, लेकिन वे केवल फिर से शुरू करने के बाद स्क्रीन को अनलॉक करने के बाद नहीं चला।

क्या फिर से शुरू होने के बाद स्क्रीन को अनलॉक करने के बाद स्क्रिप्ट चलाने का एक तरीका है?


उपयोगकर्ता नाम को हार्ड कोड नहीं करने के लिए, आप usersयह मान सकते हैं कि कोई अन्य व्यक्ति लॉग इन नहीं है (या इससे कोई फर्क नहीं पड़ता)
Sparhawk

जवाबों:


9

ऐसा लगता है कि आपको पिछले उत्तर के किसी भी रास्ते में उपयोगकर्ता नाम कोड को कठिन करना है, इसलिए यहाँ /etc/pm/sleep.d के लिए एक सरल स्क्रिप्ट दी गई है, अगर किसी को जल्दी ठीक करना है:

#!/bin/bash 
case "$1" in
    hibernate|suspend)
        sudo -u USERNAME env DISPLAY=:0 zenity --info --text "do stuff on suspend"
        ;;
    thaw|resume)
        sudo -u USERNAME env DISPLAY=:0 zenity --info --text "do stuff on resume"
        ;;
esac

6

यूनिक्स और लिनक्स साइट पर यह प्रश्न डबस संदेशों का उपयोग करते हुए एक वैकल्पिक दृष्टिकोण का दस्तावेजीकरण करता है:

dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" | ( while true; do read X; if echo $X | grep "boolean true" &> /dev/null; then SCREEN_LOCKED; elif echo $X | grep "boolean false" &> /dev/null; then SCREEN_UNLOCKED; fi done )

(SCREEN_LOCKED और SCREEN_UNLOCKED को उन क्रियाओं से बदलें जिन्हें आप निष्पादित करना चाहते हैं।)

का प्रयोग xrandr 1>/dev/null 2>1के रूप में खोलने पर कार्रवाई मेरी समस्या यह है कि मॉनीटर रिज़ॉल्यूशन / पदों को सही ढंग से स्क्रीन को अनलॉक पर पुनर्स्थापित किया जा रहा नहीं कर रहे थे फिक्स्ड (xrandr एक फिर से पढ़ने स्क्रीन सेटिंग्स के कारण लगता है)। मैंने अपने .bash_profile में पृष्ठभूमि कार्य के रूप में इस पंक्ति को जोड़ा (सख्ती से यह ~ / .config / autostart में एक डेस्कटॉप फ़ाइल के रूप में बेहतर हो सकता है, क्योंकि यह केवल तभी चलता है जब आप सूक्ति शुरू करते हैं):

dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" | ( while true; do read X; if echo $X | grep "boolean false" &> /dev/null; then xrandr 1>/dev/null 2>1; fi done ) &

ग्नोम-स्क्रीनसेवर एपीआई पर आगे की पृष्ठभूमि इस साइट पर पाई जा सकती है , और यहां डबस मॉनिटर पर ।


1

एक समाधान एक स्क्रिप्ट है जो डेस्कटॉप में लॉग इन करते समय चलती है, और जो डब संदेश को पकड़ती है। सस्पेंड से फिर से शुरू होने के बाद स्क्रीन लॉक हो जाती है, और पासवर्ड दर्ज करने के बाद, डब पर एक अनलॉक घटना होती है।

(मुझे सही रास्ते पर रखने के लिए किम एसजे के लिए धन्यवाद। मेरे पास कोई स्क्रीनसेवर सिग्नल नहीं है, लेकिन उपयोग करने के लिए एक और इंटरफ़ेस मिला)।

में ~/.config/autostart/, मेरे पास एक .desktop फ़ाइल है जो एक bash स्क्रिप्ट शुरू करती है:

$ cat ~/.config/autostart/mymonitor.desktop
[Desktop Entry]
Categories=System;Monitor;
Comment=Monitor dbus for unlock signals
Exec=/usr/local/bin/unlock_monitor
Name=unlock_monitor
Type=Application

unlock_monitorमॉनिटर स्क्रिप्ट से dbus संदेशों को पढ़ता है com.canonical.Unity.Sessionऔर पर सामान करता Unlockedसंकेत:

#!/bin/bash

dbus-monitor --session "type=signal,interface=com.canonical.Unity.Session" --profile \
| while read dbusmsg; do
    if [[ "$dbusmsg" =~ Unlocked$ || "$dbusmsg" =~ NameAcquired$ ]] ; then
        sleep 5
        notify-send "$(basename $0)" "Unlocked or freshly logged in..."
        # ...
    fi
done

लॉग इन करते समय, "अनलॉक" सिग्नल नहीं होता है, लेकिन dbus-monitorशुरू होने पर "NameAcquired" सिग्नल होता है।


0

आप स्टार्ट-स्टॉप-डेमॉन का उपयोग करके स्क्रिप्ट चला सकते हैं। स्टार्ट-स्टॉप-डेमन विभिन्न यूआईडी और जीआईडी ​​के रूप में चलने वाले धागे को कांटा कर सकता है, इसलिए आपकी समस्या को हल कर सकता है।

आपको जो करने की ज़रूरत है वह सिस्टम PATH में रखी गई नौकरी की स्क्रिप्ट लिखने के लिए है /usr/bin, और में एक अतिरिक्त डेमॉन स्क्रिप्ट बनाने के लिए /etc/pm/sleep.d। मेलिंग pm-suspendएक्शन जैसे resumeया thawडेमॉन स्क्रिप्ट जॉब स्क्रिप्ट के जरिए काम करती है

start-stop-daemon --start $ARGs --name nm-rtvt--exec /usr/bin/job_script

कहाँ या बस ARGsहो सकता है ।--chuid 1001:1001--user your_username

और सत्यनिष्ठा के लिए, आप चाहते हैं कि डेमॉन स्क्रिप्ट को लानत को रोकने से nm-rtvtपहले नामांकित रोक दिया जाए

start-stop-daemon --stop <...>

मिलान pm-suspendक्रिया जैसे suspendया hibernate

जानकारी के लिए, man start-stop-daemon। और /etc/init.dडेमॉन स्क्रिप्ट के कई अन्य उदाहरण हैं।

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