मैं यूनिटी से उलटी गिनती के साथ सूक्ति-सत्र-आह्वान कैसे कर सकता हूं?


13

कीबोर्ड शॉर्टकट के साथ शटडाउन करने में सक्षम होने के लिए हम gnome-session-quit ---power-offकस्टम शॉर्टकट को असाइन कर सकते हैं ।

एकता में यह निम्नलिखित संवाद की ओर ले जाएगा:

यहाँ छवि विवरण दर्ज करें

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

gnome-session-quit --poweroffएक ही सिस्टम (14.04 LTS) पर गनोम सत्र फ्लैशबैक सत्र से कॉल करने पर उलटी गिनती सहित पुराना संवाद वापस आ जाता है:

यहाँ छवि विवरण दर्ज करें

इसलिए हम जानते हैं कि यह कहीं पर बसता है।

क्या एकता सत्र चलाने पर इस पुराने संवाद को कॉल करने का कोई तरीका है?


क्या एकता में एक छिपा हुआ टाइमर नहीं है, इसलिए यह 60 सेकंड के बाद भी बिजली बंद करता है ??
टिम

askubuntu.com/questions/14794/… मदद कर सकते हैं
टिम

दोनों के लिए: नए संवाद के साथ बात यह है कि यह स्पष्ट रूप से उपयोगकर्ता चयन के लिए इंतजार कर रहा है कि क्या करना है ...: /
Takkat

2
@Serg विंडो सत्र प्रबंधक के अंतर्गत आता है (मैंने एक फ़ाइल में नई विंडो के गुण लिखने के लिए एक पृष्ठभूमि स्क्रिप्ट चलाई)। समस्या यह है कि यह अलग तरह से व्यवहार करता है, खिड़की प्रबंधक पर निर्भर करता है।
जैकब वलीजम

1
@JacobVlijm: हाँ, यह वही है जो मैं भी देख सकता था ... यह जाहिरा तौर पर WM को पोल करता है और फिर इस या उस दिनचर्या को कॉल करता है, लेकिन मुझे इसे मजबूर करने का कोई तरीका नहीं मिला है।
तक़ट

जवाबों:


10

यहाँ वांछित व्यवहार का अनुकरण करने के लिए एक स्क्रिप्ट है। साथ चलना चाहिए sudo। एक कीबोर्ड शॉर्टकट के लिए बाध्य किया जा सकता है ( पासवर्ड रहित चलाने की अनुमति केshutdown लिए sudoers फ़ाइल में कमांड के प्रारंभिक जोड़ के साथ )। सरलीकृत, संक्षिप्त, और काम करता है।

#!/bin/bash
# Date: June 11,2015
# Author: Serg Kolo
# Description: a script to emulate
# behavior of GNOME session flashback
# shutdown dialog

# Tell ubuntu to shutdown in 1 min
shutdown -P +1 &
# Show the dialog
zenity --question --text="Shutdown now ? Automatic shutdown in 60 seconds" --ok-label="DOIT" 
# If user clicks DOIT, then cancel the old 
# shutdown call that has countdown,
# (because only one shutdown command can be run at a time), and
# tell ubuntu to shutdown immediately
# otherwise - cancel it
if [ $? -eq 0 ];then
        shutdown -c
        shutdown -P now
else
        shutdown -c
fi

अपडेट: 14 जून

जैसा कि Takkat द्वारा सुझाया गया है, यहाँ एक स्क्रिप्ट है जो zenity --timer विकल्प का उपयोग करती है और sudo एक्सेस की आवश्यकता के बिना समान व्यवहार को प्राप्त करने के लिए dbus:

#!/bin/bash
# Date: June 14,2015
# Author: Serg Kolo
# Description: a script to emulate
# behavior of GNOME session flashback
# shutdown dialog
# version #2

zenity --question --text="Shutdown now ? Autoshutdown in 60 seconds" \
    --cancel-label="DOIT" --ok-label="NOPE" --timeout=60 ||  
  dbus-send --system --print-reply --dest=org.freedesktop.login1 \
    /org/freedesktop/login1 "org.freedesktop.login1.Manager.PowerOff" boolean:true

यहां मूल विचार यह है कि जिनीटी का टाइमआउट विकल्प 0 से अधिक कोड के साथ बाहर निकलता है, जिसका अर्थ है आमतौर पर कमांड विफल। इसलिए शून्यता के रद्द विकल्प और समयबाह्य को बंद करने की शर्त के रूप में व्यवहार करके, हम OR ऑपरेटर ( ||) का उपयोग केवल तभी बंद करते हैं जब उपयोगकर्ता रद्द बटन ("DOIT" के रूप में लेबल) या डायल आउट बार क्लिक करता है।

उपयोगकर्ता अनुभव को बेहतर बनाने के लिए एक और बदलाव के साथ किया जा सकता है yad(इन कमांड के साथ पहले स्थापित करने की आवश्यकता है sudo apt-add-repository ppa:webupd8team/y-ppa-manager;sudo apt-get update; sudo apg-get install yad)। यह भिन्नता उपयोगकर्ता को यह बताने के लिए प्रगति बार का उपयोग करती है कि कितना समय बचा है

    #!/bin/bash
    yad --auto-close --sticky --on-top --skip-taskbar --center \
  --text 'Shutdown now ? Autoshutdown in 60 seconds.' \
  --button="gtk-ok:1" --button="gtk-close:0" --image=dialog-question \ 
--title 'Shutdown' --timeout=60 --timeout-indicator=top || 
dbus-send --system --print-reply --dest=org.freedesktop.login1 \
/org/freedesktop/login1 "org.freedesktop.login1.Manager.PowerOff" boolean:true

एक अन्य संभावित संस्करण, इस बात को ध्यान में रखता है कि यदि आप जिनीट के ओके बटन लेबल को बदलते हैं, तो डिफ़ॉल्ट रूप से हाइलाइट किया गया बटन ओके बटन हो सकता है या नहीं।

zenity --question --timeout 10 --text="Automatic shutdown in 10 seconds"
if [[ $? -eq 1 ]] ; then
    # user clicked Cancel
    exit 
else
    dbus-send --system --print-reply --dest=org.freedesktop.login1 /org/freedesktop/login1 "org.freedesktop.login1.Manager.PowerOff" boolean:true
fi

किसी भी वापसी पर सिस्टम को स्क्रिप्ट बन्द हो जाता है कि 0. नहीं है स्क्रिप्ट का समय समाप्त या तो 1 या 5 की वापसी मान निष्पादित करने के लिए स्क्रिप्ट बताती है elseहिस्सा


सूडो के साथ चलने पर एक आकर्षण की तरह काम करता है या गैर-रूट उपयोगकर्ताओं को बंद करने की अनुमति देता है। मैं ऐसा नहीं करूँगा। मुझे अपनी स्क्रिप्ट सक्षम करने के लिए निम्न संपादन एक नश्वर उपयोगकर्ता द्वारा चलाया जा रहा सुझाने दें: 1. poweroff के लिए उपयोग dbus के रूप में किया गया था इस जवाब में सुझाव दिया 2. उपयोग zenity --timeoutइनबिल्ट टाइमर। इसके द्वारा हमें बाद में शटडाउन रद्द / पुनः आरंभ नहीं करना पड़ेगा।
ताकत

@ तक्कट ने एक और स्क्रिप्ट जोड़ी जो आपके सुझावों का उपयोग करती है। कृपया समीक्षा करें
सर्गी कोलोडाज़नी

यह रूट पासवर्ड के बिना वास्तव में शटडाउन करता है, लेकिन RETURN कुंजी के साथ तत्काल शटडाउन के लिए डिफ़ॉल्ट रूप से OK / DOIT बटन का चयन नहीं किया जाता है। हम ऐसी ही स्क्रिप्ट का उपयोग if [[ $? -eq 1 ]] ; then exit \else dbus...शर्त के साथ करते हैं जो ऐसा करती है। जाहिर है कि पुराने लॉगआउट-हेल्पर को बुलाने का कोई रास्ता नहीं दिखता ...
Takkat

Yad को स्थापित करने के लिए कमांड जोड़ें;)
AB

काश मैं दोनों जवाबों में इनाम को विभाजित कर सकता। इस तरह के दो समान उत्तर होने के बाद यहां निर्णय लेना बहुत कठिन था। अंत में मैंने इसे जैकब को दे दिया क्योंकि उनका जवाब थोड़ा अधिक बहुमुखी प्रतीत होता है। लेकिन आपकी स्क्रिप्ट शानदार तरीके से अपना काम करती है, और यह बहुत सरल है। मैं इसे शीर्ष उत्तर के रूप में दिखाने के बजाय स्वीकृत के रूप में चिह्नित करूंगा। मुझे उम्मीद है कि इसे समय के साथ और भी अधिक वोट मिलेंगे।
ताकत

6

नहीं सचमुच आप के लिए क्या कहा, लेकिन कम से कम एक (प्रभावी रूप से) तुलनीय समाधान एक शॉर्टकट कुंजी के अंतर्गत नीचे स्क्रिप्ट डाल करने के लिए किया जाएगा।

यह क्या करता है

जब शॉर्टकट कुंजी का उपयोग किया जाता है:

  • gnome-session-quit --power-offआदेश चला जाता है
  • माउस को "क्लोज़" बटन पर ले जाया जाता है, प्रभावी रूप से शटडाउन बटन को पूर्व-चयनित बनाता है:

    यहाँ छवि विवरण दर्ज करें

फिर:

  • यदि उपयोगकर्ता दबाता है Enter, तो सिस्टम बंद हो जाता है
  • यदि उपयोगकर्ता कुछ नहीं करता है, तो सिस्टम 30 सेकंड (या आपके द्वारा सेट किए जाने की किसी अन्य अवधि) की प्रतीक्षा करता है और नीचे बन्द हो जाता है।
  • यदि उपयोगकर्ता 30 सेकंड के दौरान माउस को स्थानांतरित करता है, तो प्रक्रिया बंद कर दी जाती है

लिपी

#!/usr/bin/env python3
import subprocess
import time

#--- set the location of the close button x, y
q_loc = [1050, 525]
#--- set the time to wait before shutdown
countdown = 30

subprocess.Popen(["gnome-session-quit", "--power-off"])
# for slower systems, set a longer break, on faster systems, can be shorter:
time.sleep(0.4)
subprocess.Popen(["xdotool", "mousemove", str(q_loc[0]), str(q_loc[1])])

coords1 = q_loc
t = 0

while True:
    time.sleep(1)
    cmd = "xdotool", "getmouselocation"
    currloc = subprocess.check_output(cmd).decode("utf-8").split()[:2]
    coords2 = [int(n.split(":")[1]) for n in currloc]
    if coords2 != coords1:
        break
    else:
        if t >= countdown:
            subprocess.Popen(["xdotool", "key", "KP_Enter"])
            break
    t += 1

कैसे इस्तेमाल करे

मुझे पूरा यकीन है कि आप इसका उपयोग करना जानते हैं, लेकिन यहाँ हम हैबिट कारणों से जाते हैं:

  1. स्क्रिप्ट का उपयोग करता है xdotool

    sudo apt-get install xdotool
    
  2. स्क्रिप्ट को एक खाली फ़ाइल में कॉपी करें, इसे इस रूप में सहेजें run_close.py

  3. हेड सेक्शन में, क्लोज-विंडो में शट-डाउन बटन का स्क्रीन स्थान सेट करें (मेरा पहला अनुमान सही था):

    #--- set the location of the close button x, y
    q_loc = [1050, 525]
    

    और बिना बंद किए जाने से पहले प्रतीक्षा करने का समय:

    #--- set the time to wait before shutdown
    countdown = 30
    
  4. इसे कमांड द्वारा टेस्ट करें:

    python3 /path/to/run_close.py
    

    विकल्प के सभी के साथ इसका परीक्षण करें: Enterतत्काल शटडाउन के लिए दबाव , बंद शटडाउन और माउस द्वारा प्रक्रिया को तोड़ दें

  5. यदि सभी ठीक काम करते हैं, तो इसे शॉर्टकट कुंजी में जोड़ें: चुनें: सिस्टम सेटिंग्स> "कीबोर्ड"> "शॉर्टकट"> "कस्टम शॉर्टकट"। "+" पर क्लिक करें और कमांड जोड़ें:

     python3 /path/to/run_close.py
    

संपादित करें

स्क्रिप्ट के एक संस्करण के नीचे जिसे किसी भी अतिरिक्त सेटिंग की आवश्यकता नहीं है। यह बटन के निर्देशांक की गणना करता है, चाहे स्क्रीन का रिज़ॉल्यूशन कोई भी हो।

सेटअप बहुत अधिक समान है, लेकिन [3.]छोड़ दिया जा सकता है।

#!/usr/bin/env python3
import subprocess
import time

#--- set the time to wait before shutdown
countdown = 30

def get_qloc():
    xr = subprocess.check_output(["xrandr"]).decode("utf-8").split()
    scrs = [s.split("+") for s in xr if all([s.count("x") == 1, s.count("+") == 2])]
    center = [int(int(s)/2) for s in [scr[0] for scr in scrs if scr[1] == "0"][0].split("x")]
    return [center[0] + 250, center[1]]

q_loc = get_qloc()

subprocess.Popen(["gnome-session-quit", "--power-off"])
# for slower systems, set a longer break, on faster systems, can be shorter:
time.sleep(0.4)
subprocess.Popen(["xdotool", "mousemove", str(q_loc[0]), str(q_loc[1])])

coords1 = q_loc
t = 0

while True:
    time.sleep(1)
    cmd = "xdotool", "getmouselocation"
    currloc = subprocess.check_output(cmd).decode("utf-8").split()[:2]
    coords2 = [int(n.split(":")[1]) for n in currloc]
    if coords2 != coords1:
        break
    else:
        if t >= countdown:
            subprocess.Popen(["xdotool", "key", "KP_Enter"])
            break
    t += 1

व्याख्या

सिस्टम को बंद करने के लिए सत्र प्रबंधक विंडो का आकार हमेशा स्क्रीन के रिज़ॉल्यूशन से स्वतंत्र और एक निश्चित (निरपेक्ष) आकार का होता है। इसलिए स्क्रीन के केंद्र के सापेक्ष स्थिति एक स्थिर कारक है।

इसके बाद हमें केवल स्क्रीन के रिज़ॉल्यूशन को पढ़ना है और वहां से बटन की स्थिति की गणना करना है।

लागू फ़ंक्शन ( get_qloc()) बाईं स्क्रीन के रिज़ॉल्यूशन की गणना करता है , क्योंकि वह वह है जहां संवाद दिखाई देगा।

ध्यान दें

समय, लाइन time.sleep(0.4)में सेट अपेक्षाकृत धीमी प्रणालियों के लिए सेट किया गया है, यह सुनिश्चित करने के लिए कि शट डाउन विंडो दिखाई देने के बाद माउस को स्थानांतरित कर दिया जाए। तेज सिस्टम पर, यह धीमा हो सकता है, धीमी प्रणालियों (जैसे संभवतः एक वीएम) पर इसे लंबे समय तक सेट करने की आवश्यकता हो सकती है।


@ टकटक फिक्स्ड, इस संस्करण को किसी भी रिज़ॉल्यूशन पर काम करना चाहिए।
जैकब वलीजम

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