हाइबरनेट में निलंबन से स्वचालित रूप से कैसे जाएं?


53

क्या सस्पेंड, उर्फ ​​"सस्पेंड सेडेशन" से उबंटू को हाइबरनेट राज्य में जाना संभव है?

मैं जो देख रहा हूं वह यह है:
जब मैं ढक्कन को बंद करता हूं, तो लैपटॉप को सस्पेंड में डाल दिया जाता है। फिर, एक पूर्व-निर्धारित समय के बाद (भले ही बैटरी मजबूत हो रही हो) अगर मैं अभी भी इसका उपयोग नहीं करता हूं, तो इसे बैटरी की शक्ति को बचाने के लिए खुद को हाइबरनेट में डाल देना चाहिए।

उदाहरण के लिए, मेरा लैपटॉप ढक्कन बंद करने के बाद एक सस्पेंड में जाने के लिए सेट है। यदि तब मैं इसे पूरे दिन के लिए उपयोग नहीं करता हूं, तो बैटरी सपाट हो जाती है, क्योंकि सस्पेंड मोड में भी हार्डवेयर अभी भी थोड़ी मात्रा में बिजली की खपत करता है, और बैटरी अंततः निर्वहन करती है। मैं जो चाहता हूं वह उबंटू को बताने में सक्षम हो सकता है कि भले ही वह निलंबित हो, लेकिन कुछ घंटों की निष्क्रियता के बाद भी उसे हाइबरनेट में जाना होगा।

विंडोज ऐसा कर सकता है। उबंटू को टाइमर पर स्टैंडबाय या हाइबरनेट में जाने के लिए प्रोग्राम किया जा सकता है , लेकिन दोनों में नहीं।


अपने शोध में मैंने एक ही लिनक्स मिंट धागा पाया, लेकिन "सस्पेंड सेडेशन" उस सुविधा के लिए एक आधिकारिक Microsoft शब्द नहीं है और जहां तक ​​मैं बता सकता हूं कि लिनक्स मिंट फोरम उपयोगकर्ता द्वारा आविष्कार किया गया था जिसने इसका उल्लेख किया था।
ayan4m1

क्या उस सुविधा का कोई बेहतर नाम है?
सर्गी स्टैडनिक

जहां तक ​​मैं बता सकता हूं, सुविधा के लिए कोई सार्वभौमिक रूप से स्वीकृत नाम नहीं है। "हाइब्रिड सस्पेंड" का उपयोग कुछ लोग करते हैं, "सस्पेंड बेहोश करने की क्रिया" का उपयोग उस एक लिनक्स टकसाल मंच उपयोगकर्ता द्वारा किया जाता है, और मैंने "हाइबरनेट और सस्पेंड" सुना है जिसका उपयोग प्रक्रिया से पहले करने के लिए किया जाता है। Microsoft आधिकारिक तौर पर इसे विंडोज 7 के लिए "हाइब्रिड स्लीप" के रूप में संदर्भित करता है।
ayan4m1

2
@ ayan4m1 मुझे एहसास है कि यह एक पुराना सवाल है, लेकिन मुझे लगता है कि यह स्पष्ट करना महत्वपूर्ण है। हिरबिड नींद "नींद नहीं तो एक निर्दिष्ट समय के बाद हाइबरनेट" के समान है। हाइब्रिड नींद बस हाइबरनेट हो जाती है जब बिजली खत्म हो जाती है, बैटरी चल रही है। ओपी द्वारा वर्णित व्यवहार को सक्षम करने के लिए हाइब्रिड स्लीप की आवश्यकता नहीं है।
पॉल

जवाबों:


20

में उबंटू 18.04 यह बहुत ज्यादा आसान। में systemd एक नया मोड उपलब्ध है निलंबित-से-हाइबरनेट । इस फ़ंक्शन का उपयोग शुरू करने के लिए आपको अगली सामग्री के साथ एक फ़ाइल /etc/systemd/sleep.conf बनाने की आवश्यकता है:

[Sleep]
HibernateDelaySec=3600

फिर आप इसे कमांड द्वारा टेस्ट कर सकते हैं:

sudo systemctl suspend-then-hibernate

आप HibernateDelaySecहाइबरनेट में देरी को कम करने के लिए संपादित कर सकते हैं।


यदि सभी ठीक काम करता है तो आप Lid क्लोज एक्शन को बदल सकते हैं, इसे करने के लिए आपको फ़ाइल /etc/systemd/logind.conf को संपादित करने की आवश्यकता है

आपको विकल्प ढूंढना होगा HandleLidSwitch=, इसे अनलाइक करना होगा और इसे बदलना होगा HandleLidSwitch=suspend-then-hibernate। फिर आपको अगले कमांड द्वारा सिस्टमड-लॉगइंड सेवा (चेतावनी! आप उपयोगकर्ता सत्र फिर से शुरू किया जाएगा) को पुनरारंभ करने की आवश्यकता है:

sudo systemctl restart systemd-logind.service

बस इतना ही! अब आप इस अच्छे फ़ंक्शन का उपयोग कर सकते हैं।


इस पर हाजिर था। पॉप पर इसका उपयोग! _ 18.3 (उर्फ उबंटू 18.10)।
eduncan911

शानदार धन्यवाद! क्या स्लीप.कॉन्फ़ हाइबरनेट मोड को किसी तरह से प्रभावित करता है, या केवल सस्पेंड-तब-हाइबरनेट को प्रभावित करता है?
user2428107

@ user2428107 आप मैनुअल systutorials.com/docs/linux/man/5-systemd-sleep
PRIHLOP में

35

इसका समाधान सरल है। सबसे पहले, पर निरस्त करने और फिर से शुरू, बजे-निलंबित कार्यक्रम में स्क्रिप्ट की एक श्रृंखला कार्यान्वित /etc/pm/sleep.dऔर /usr/lib/pm-utils/sleep.d। तो मेरा समाधान एक स्क्रिप्ट को जोड़ना है जो निम्नलिखित कार्य करता है:

  1. निलंबित होने पर, वर्तमान समय रिकॉर्ड करें और rtcwake का उपयोग करके एक वेकअप इवेंट पंजीकृत करें।
  2. फिर से शुरू करने पर, ऊपर से रिकॉर्ड किए गए समय के खिलाफ वर्तमान समय की जांच करें। यदि पर्याप्त समय बीत चुका है, तो हम शायद rtc टाइमर इवेंट के कारण जाग गए हैं। अन्यथा हम एक उपयोगकर्ता घटना (जैसे कि लैपटॉप स्क्रीन को खोलना) के कारण जल्दी जाग गए।
  3. अगर हम rtc टाइमर की वजह से जागते हैं, तो तुरंत हाइबरनेशन में जाने के लिए "pm-hibernate" कमांड जारी करें।

यहां एक स्क्रिप्ट है जो ऐसा करती है। इसे नाम दें 0000rtchibernateऔर इसे /etc/pm/sleep.dनिर्देशिका में रखें (0000 महत्वपूर्ण है, ताकि स्क्रिप्ट पहले सस्पेंड पर निष्पादित हो, और फिर से शुरू हो)।

#!/bin/bash
# Script name: /etc/pm/sleep.d/0000rtchibernate
# Purpose: Auto hibernates after a period of sleep
# Edit the "autohibernate" variable below to set the number of seconds to sleep.
curtime=$(date +%s)
autohibernate=7200
echo "$curtime $1" >>/tmp/autohibernate.log
if [ "$1" = "suspend" ]
then
    # Suspending.  Record current time, and set a wake up timer.
    echo "$curtime" >/var/run/pm-utils/locks/rtchibernate.lock
    rtcwake -m no -s $autohibernate
fi

if [ "$1" = "resume" ]
then
    # Coming out of sleep
    sustime=$(cat /var/run/pm-utils/locks/rtchibernate.lock)
    rm /var/run/pm-utils/locks/rtchibernate.lock
    # Did we wake up due to the rtc timer above?
    if [ $(($curtime - $sustime)) -ge $autohibernate ]
    then
        # Then hibernate
        rm /var/run/pm-utils/locks/pm-suspend.lock
        /usr/sbin/pm-hibernate
    else
        # Otherwise cancel the rtc timer and wake up normally.
        rtcwake -m no -s 1
    fi
fi

उम्मीद है कि यह कोड इस संदेश बोर्ड पर आएगा (यह मेरी पहली पोस्ट है)।

autohibernate=7200शीर्ष पर टाइमआउट मान संपादित करें , हालांकि कई सेकंड्स जो आप हाइबरनेशन में जाने से पहले सोते हैं। ऊपर वर्तमान मूल्य 2 घंटे है। ध्यान दें, कि आप उस समय कुछ सेकंड के लिए जागेंगे, जबकि यह हाइबरनेट फ़ंक्शन को निष्पादित कर रहा है।

इसलिए यदि आप अपने लैपटॉप को एक मामले में रखने की योजना बना रहे हैं, तो निलंबित न करें, बल्कि इसके बजाय हाइबरनेट करें। अन्यथा आपका लैपटॉप एस्प में गर्म हो सकता है। यदि यह एक तंग फिटिंग पर्ची मामले में है (हालांकि यह केवल कुछ सेकंड से एक मिनट के लिए होगा)।

मैं पिछले कुछ दिनों से इस पद्धति का उपयोग कर रहा हूं, अब तक यह सफल रहा है (और आज दोपहर मुझे एक मृत बैटरी से बचाया गया है)। का आनंद लें।

अन्य लिनक्स डिस्ट्रीब्यूशन के लिए जो systemdउबंटू वर्जन और नए वर्जन का उपयोग करते हैं, यह तब भी काम करना चाहिए जब आप स्क्रिप्ट को /usr/lib/systemd/system-sleepइसके स्थान पर रखते हैं /etc/pm/sleep.d। इसके अलावा, /usr/sbin/pm-hibernateकमांड को बदलें systemctl hibernate


यह यहाँ काम किया है, लेकिन मैं केवल हर किसी के लिए एक्स को जोड़ने के लिए फ़ाइल chmoded के बाद। मैं बहुत बड़ा नौसिखिया हूं और मुझे यह पता लगाने में 2 दिन लग गए। बहुत अच्छी स्क्रिप्ट और मुझे उम्मीद है कि इससे किसी को भी समस्या हो सकती है। धन्यवाद।

2
यह एक उपयोगी उबंटू / डेबियन पैकेज बना देगा!
पेट्र पुडलक

बस सोच रहा था: क्या यह अभी भी Ubuntu 13.04 के लिए मान्य होगा? मुझे वास्तव में इस समाधान की आवश्यकता है लेकिन मैं पत्नी के लैपटॉप के साथ गड़बड़ नहीं करना चाहता अगर यह नए संस्करणों पर चीजों को तोड़ने के लिए निकलता है।
तोरबेन गुंडोफ़्ते-ब्रून

स्क्रिप्ट के लिए धन्यवाद। मेरे लिए Ubuntu 14.04 पर ठीक काम करता है! एक सुधार यह होगा कि जब लैपटॉप हाइबरनेट करने के लिए उठता है, तो यह देखने के लिए जांच सकता है कि क्या यह एसी पावर में प्लग किया गया है। यदि हां, तो मैं चाहता हूं कि यह हाइबरनेट करने के बजाय फिर से निलंबित हो जाए। हाइबरनेट से पुनर्स्थापित करने में अधिक समय लगता है और जब इसे प्लग किया जाता है तो मुझे वास्तव में हाइबरनेट करने की आवश्यकता नहीं होती है ...
maddentim

बहुत बहुत धन्यवाद!!!! यह स्क्रिप्ट जादू है जिसका मैं सपना देख रहा था !!
यान्प्स

12

यह समझने के लिए कि यह कैसे काम करता है (यह विंडोज के समान है) सरल शब्दों में: मशीन स्टैंडबाय से नहीं उठती है जब बैटरी स्वैप करने के लिए मशीन की स्थिति को बचाने में सक्षम होने के लिए कम हो जाती है, यह सब कुछ तुरंत स्वैप विभाजन में बचाता है स्टैंडबाय पर, और जब बैटरी खत्म हो जाती है, तो यह उस राज्य को स्वैप विभाजन से लोड करके पुनर्प्राप्त करेगा (जैसा कि आप हाइबरनेट होने पर करते हैं)।

AFAIK लिनक्स "सामान्य" स्टैंडबाय के बजाय हाइब्रिड स्टैंडबाय / हाइबरनेट का उपयोग करेगा / यदि वह जानता है कि यह आपके हार्डवेयर के लिए काम करता है। यह भी संभव है कि यह वर्तमान में बहुत अधिक बग या कुछ के कारण अक्षम हो ...;)

यदि आप प्रयोग करना पसंद करते हैं, तो शायद आप देख सकते हैं कि क्या आपको शाम-सस्पेंड-हाइब्रिड के साथ कोई अच्छा परिणाम मिल सकता है ।

यदि निम्नलिखित कहते हैं कि आप भाग्यशाली हैं, तो सिद्धांत रूप में हाइब्रिड सस्पेंड आपके सिस्टम पर समर्थित है:

pm-is-supported --suspend-hybrid && echo "you're lucky"

1
आपके शेल कमांड में एकल एपोस्ट्रोफ भ्रामक और भ्रामक हो सकता है ... कृपया इससे बच जाएं।
ayan4m1

1
बाह, यह तब होता है जब आप एक कमांडलाइन के रूप में इसके बारे में सोचे बिना, अन्य पाठ के अंदर एम्बेड की गई कमांडलाइन को संपादित करते हैं ... धन्यवाद और निश्चित।
JanC

कोई बात नहीं, हाँ दो प्रक्रियाओं के लिए अलग-अलग हेडस्पेस के बारे में समझ में आया।
ayan4m1

6

आपको s2both में रुचि हो सकती है । यह uswsuspउबंटू 10.10 में पैकेज द्वारा प्रदान किया गया है । यह डिस्क को निलंबित कर देता है, लेकिन इसके बजाय सिस्टम को बंद करने के बजाय इसे S3 में डालता है, जो कि उबंटू में "सस्पेंड" विकल्प के साथ जुड़ा हुआ है। पीएम-सस्पेंड-हाइब्रिड एक और उपकरण है जो समान कार्य करने के लिए शुद्ध करता है।

ढक्कन को बंद करने के लिए इसे स्वचालित बनाने के लिए, निम्नलिखित गाइड पर एक नज़र डालें जो आपको ढक्कन की घटना के पकड़े जाने पर एक मनमाना स्क्रिप्ट चलाने की अनुमति देता है:

http://ubuntuforums.org/showthread.php?t=1076486

यदि आपके पास एक थिंकपैड है, तो इसके लिए मैनपेज tpctlएक तर्क का संदर्भ देता है --pm-sedation-hibernate-from-suspend-timer, जो आपको वह सुविधा प्रदान करने के लिए लगता है जिसे आप खोज रहे हैं। मैं आपको गैर-थिंकपैड हार्डवेयर पर यह कोशिश करने के खिलाफ सावधान करूंगा।

संदर्भ के लिए, मैंने hibernate.conf के मैनपेज के माध्यम से देखा ; यह किसी भी प्रासंगिक विकल्प नहीं लगता था, लेकिन एक दूसरे पढ़ने लायक हो सकता है।


5

उबंटू 16.04 - पूर्व-निर्धारित समय के बाद सस्पेंड / स्लीप में हाइबरनेट करें

ऐसा लगता है कि Ubuntu पर 16.04 चीजें थोड़ी अलग हैं, इसलिए मैंने इसे काम करने के लिए जो कदम उठाए, वे थे:

  1. सुनिश्चित करें कि हाइबरनेट चलने के दौरान अपेक्षित रूप से काम कर रहा है

    systemctl hibernate
    
  2. मूल suspend.targetफ़ाइल की प्रतिलिपि बनाएँ :

    sudo cp /lib/systemd/system/suspend.target /etc/systemd/system/suspend.target
    

    फिर फ़ाइल को संपादित करें /etc/systemd/system/suspend.targetऔर लाइन जोड़ें:

    Requires=delayed-hibernation.service
    

    [Unit]उस फ़ाइल के अनुभाग में।

  3. /etc/systemd/system/delayed-hibernation.serviceनिम्नलिखित सामग्री के साथ फ़ाइल बनाएँ :

[यूनिट]
विवरण = विलंबित हाइबरनेशन ट्रिगर
= Suspend.target से पहले
विरोध = hibernate.target संकर-suspend.target
StopWhenUnneeded = true

[सेवा]
Type = Oneshot
RemainAfterExit = हाँ
ExecStart = / usr / स्थानीय / बिन / विलंबित-hibernation.sh पूर्व निलंबन
ExecStop = / usr / लोकल / बिन / विलंबित-hibernation.sh पोस्ट सस्पेंड

[इंस्टॉल करें I]
WantedBy = sleep.target
  1. /etc/delayed-hibernation.confनिम्न सामग्री के साथ स्क्रिप्ट के लिए कॉन्फ़िगरेशन फ़ाइल बनाएँ :
# 'देरी-अहिंसा.श' स्क्रिप्ट के लिए विन्यास फाइल

# कंप्यूटर हाइबरनेट होने से पहले नींद मोड में बिताने के लिए सेकंड में समय निर्दिष्ट करें
TIMEOUT = 1200 # सेकंड, 20 मिनट देता है
  1. स्क्रिप्ट बनाएं जो वास्तव में कड़ी मेहनत करता है।

    /usr/local/bin/delayed-hibernation.shसामग्री के साथ फ़ाइल बनाएँ :

#! / Bin / bash
# लिपि का नाम: विलंबित-अतिग्रहण। श
# उद्देश्य: नींद की अवधि के बाद ऑटो हाइबरनेट करता है
# सोने के लिए सेकंड की संख्या निर्धारित करने के लिए `$ हाइबरनेशन_कोन`` फ़ाइल में` टाइमटाइम` चर को संपादित करें।

hibernation_lock = '/ var / रन / देरी-hibernation.lock'
hibernation_fail = '/ var / चलाने / delayed-hibernation.fail'
hibernation_conf = '/ etc / देरी-hibernation.conf'

# कॉन्फ़िगरेशन फ़ाइल की जाँच करना
अगर [ ! -फ़ $ हाइबरनेशन_कोन]; फिर
    इको "मिसिंग कॉन्फ़िगरेशन फ़ाइल ('$ hibernation_conf'), गर्भपात।"
    बाहर निकलें 1
फाई
hibernation_timeout = $ (grep "^ [^ #]" $ hibernation_conf | grep "TIMEOUT =" | awk -F '=' '{$ $ 2}' | awk -F '#' '{$ $ 1}' 'tr -dd '[[\ t]]')
अगर ["$ hibernation_timeout" = ""]; फिर
    इकोनॉन्फ़िगरेशन फ़ाइल ('$ hibernation_conf') से 'मिसिंग टाइमटाइम' पैरामीटर गूंज रहा है।
    बाहर निकलें 1
एलिफ [[! "$ हाइबरनेशन_टाइम" = ~ ^ [0-9] + $]]; फिर
    "खराब" टाइमटाइम 'पैरामीटर (' $ hibernation_timeout ') विन्यास फाइल (' $ hibernation_conf ') में प्रतिध्वनित, अपेक्षित संख्या में सेकंड, गर्भपात। "
    बाहर निकलें 1
फाई

# प्रसंस्करण दिए गए पैरामीटर
अगर ["$ 2" = "सस्पेंड"]; फिर
    curtime = $ (दिनांक +% s)
    अगर ["$ 1" = "पूर्व"]; फिर
        अगर [-$ $ हाइबरनेशन_फेल]; फिर
            इको "विफल हाइबरनेशन का पता चला, सेटिंग आरटीसी वीकअप टाइमर लंघन।"
        अन्य
            इको "सस्पेंड का पता चला। रिकॉर्डिंग समय, सेट आरटीसी टाइमर"
            इको "$ क्यूरेट"> $ हाइबरनेशन_लॉक
            rtcwake -m no -s $ hibernation_timeout
        फाई
    elif ["$ 1" = "पोस्ट"]; फिर
        अगर [-$ $ हाइबरनेशन_फेल]; फिर
            rm $ हाइबरनेशन_फेल
        फाई
        अगर [-$ $ हाइबरनेशन_लॉक]; फिर
            sustime = $ (बिल्ली $ hibernation_lock)
            आरएम $ हाइबरनेशन_लॉक
            अगर [$ (($ curtime - $ sustime)) -ge $ hibernation_timeout]; फिर
                गूंज "निलंबित से स्वचालित फिर से शुरू पता चला। हाइबरनेटिंग ..."
                systemctl हाइबरनेट
                अगर [$? —ने ०]; फिर
                    इको "स्वचालित हाइबरनेशन विफल रहा। इसके बजाय निलंबित करने का प्रयास किया जा रहा है।"
                    $ हाइबरनेशन_फिल स्पर्श करें
                    systemctl सस्पेंड
                    अगर [$? —ने ०]; फिर
                        इको "स्वचालित हाइबरनेशन और सस्पेंड फेलओवर विफल रहा। प्रयास करने के लिए और कुछ नहीं।"
                    फाई
                फाई
            अन्य
                गूंज "मैनुअल सस्पेंड से पता चला। समाशोधन आरटीसी टाइमर"
                rtcwake -m अक्षम करें
            फाई
        अन्य
            गूंज "फ़ाइल '$ हाइबरनेशन_लॉक' नहीं मिला, कुछ भी नहीं करने के लिए"
        फाई
    अन्य
        इको "अपरिचित पहला पैरामीटर: '$ 1', अपेक्षित 'पूर्व' या 'पोस्ट'"
    फाई
अन्य
    इको "यह स्क्रिप्ट सिस्टेक्टल डिलेड-हाइबरनेशन.सेवर (अपेक्षित दूसरा पैरामीटर: 'सस्पेंड') द्वारा चलाया जाने वाला है"
फाई
  1. स्क्रिप्ट को निष्पादन योग्य बनाएं:
chmod 755 /usr/local/bin/delayed-hibernation.sh

इस थ्रेड में अन्य उत्तरों के आधार पर इस स्क्रिप्ट को लिखने तक मुझे काफी कुछ लगा, मुझे इंटरनेट पर मिली चीजें जैसे https://bbs.archlinux.org/viewtopic.php?pid=1554259

स्क्रिप्ट का मेरा संस्करण कई समस्याओं से निपटने की कोशिश करता है, जैसे कि हाइबरनेट सफल नहीं होने पर फिर से सस्पेंड हो जाता है, लेकिन समय से पहले और निर्धारित समय के बाद दोबारा नहीं उठता है।

  1. अंतिम चरण मुझे लगता है कि सिर्फ निष्पादित करना होगा

    sudo systemctl daemon-reload
    sudo systemctl enable delayed-hibernation.service 
    

    यह सुनिश्चित करने के लिए कि नई सेवा / कॉन्फ़िगरेशन का उपयोग किया जा रहा है।

सेवा लॉग की जांच करने के लिए, आप इसका उपयोग कर सकते हैं:

sudo systemctl status delayed-hibernation.service

या सेवा उपयोग के पूर्ण लॉग के लिए:

sudo journalctl -u delayed-hibernation.service

एक सामान्य लॉग जो मुझे चल रही सेवा से मिलता है:

मील @ मील-थिंकपैड: ~ $ sudo systemctl status delayed-hibernation.service 
● देरी से हाइबरनेशन. सेवा - विलंबित हाइबरनेशन ट्रिगर
   भरी हुई: भरी हुई (/etc/systemd/system/delayed-hibernation.service; सक्षम; विक्रेता पूर्व निर्धारित: सक्षम)
   सक्रिय: निष्क्रिय (मृत)

जून 09 20:35:42 मील-थिंकपैड सिस्टमड [1]: विलंबित हाइबरनेशन ट्रिगर शुरू करना ...
Jun 09 20:35:42 माइल-थिंकपैड विलंबित-hibernation.sh [2933]: सस्पेंड का पता चला। रिकॉर्डिंग समय, आरटीसी टाइमर सेट करें
जून 09 20:35:42 मील-थिंक-स्टॉप देरी-अहिंसा.श [2933]: rtcwake: यह मानकर कि RTC UTC का उपयोग करता है ...
जून 09 20:35:42 मील-थिंक-स्टॉप देरी-अहिंसा.श [2933]: rtcwake: थु जून 9 18:55:43 2016 को / dev / rtc0 का उपयोग करके वेकअप
जून 09 20:55:44 मील-थिंकपैड सिस्टमड [1]: विलंबित हाइबरनेशन ट्रिगर शुरू हुआ।
जून 09 20:55:44 मील-थिंकपैड सिस्टमड [1]: विलंबित-हाइबरनेशन। सेवा: यूनिट की अब और आवश्यकता नहीं है। रोकना।
जून 09 20:55:44 मील-थिंकपैड systemd [1]: स्टॉपिंग डिलेड हाइबरनेशन ट्रिगर ...
जून 09 20:55:44 मील-थिंक-स्टॉप देरी-अहिर्शन।श [3093]: सस्पेंड से ऑटोमैटिक रिज्यूमे डिटेक्ट। सुप्तावस्था में ...
जून 09 20:55:44 मील-थिंकपैड systemd [1]: रूका हुआ विलंबित हाइबरनेशन ट्रिगर।
मील @ मील थिंकपैड: ~ $ 

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


उत्तर के लिए धन्यवाद, यह अभी भी उबंटू 18.04 पर एक आकर्षण की तरह काम करता है। मुझे काम करने के लिए उपरोक्त उत्तर नहीं मिल सकते हैं, /bin/systemctl hibernateसिस्टम स्क्रिप्ट में चलने पर हमेशा निष्पादन 1 वापस आएगा, भले ही यह कमांड लाइन पर ठीक काम करता हो।
युगीन

4

बस के मामले में कुछ गलत हो जाता है, जबकि pm-hibernateमैं इसे चलाने की तुलना में निलंबित करने के लिए कंप्यूटर रखा था। तो आप उपयोग कर सकते हैं:

   ...
/usr/sbin/pm-hibernate || /usr/sbin/pm-suspend
   ...

3

यहां डेरेक प्रेसनॉल के उत्तर का एक अद्यतन संस्करण है जो सिस्टमड के साथ काम करता है और इसमें एलिया कगन का सुझाव शामिल है , बस इसे /usr/lib/systemd/system-sleep/delayed_hiberbation.sh में ड्रॉप करें और इसे क्रियान्वित करें:

#!/bin/bash

hibernation_timeout=1800  #30 minutes

if [ "$2" = "suspend" ]; then
    curtime=$(date +%s)
    if [ "$1" = "pre" ]; then
        echo -e "[($curtime) $@]\nExecuting pre-suspend hook..." >> /tmp/delayed_hibernation.log
        echo "$curtime" > /var/run/delayed_hibernation.lock
        rtcwake -m no -s $hibernation_timeout
    elif [ "$1" = "post" ]; then
        echo -e "[($curtime) $@]\nExecuting post-suspend hook..." >> /tmp/delayed_hibernation.log
        sustime=$(cat /var/run/delayed_hibernation.lock)
        if [ $(($curtime - $sustime)) -ge $hibernation_timeout ]; then
            echo -e "Automatic resume detected, hibernating.\n" >> /tmp/delayed_hibernation.log
            systemctl hibernate || systemctl suspend
        else
            echo -e "Manual resume detected, clearing RTC alarm.\n" >> /tmp/delayed_hibernation.log
            rtcwake -m no -s 1
        fi
        rm /var/run/delayed_hibernation.lock
    fi
fi

यह 15.10 पर कई महीनों के लिए बहुत अच्छा काम कर रहा था, लेकिन 16.04 के बारे में कुछ इसे अभी भी हाइबरनेटिंग से रोकता है, हालांकि स्क्रिप्ट अभी भी चलती है।
सीन

@ क्या आपने इस धागे में वर्कअराउंड की कोशिश की है ?
निकोलो मैगियोनी

मुझे सही दिशा बताने के लिए धन्यवाद। मैंने एक systemd सेवा (/etc/systemd/system/delayed-hibernation.service) बनाई, जिसने ऊपर दी गई स्क्रिप्ट को संदर्भित किया / फिर संशोधित /etc/systemd/system/suspend.target को विलंबित- hibernation.service की आवश्यकता होती है।
शॉन

2

यहाँ मेरा नुस्खा है (इसे दो नोटबुक उबंटू 16.04 पर परीक्षण किया गया है):

इस लिपि को जहाँ भी आप चाहें (मैं इसे जड़ में डाल देता हूँ /syspend.sh) और इसे निष्पादन योग्य बना देता हूँ ( chmod +x /suspend.sh)

TIMELOG=/tmp/autohibernate.log
ALARM=$(tail -n 1 $TIMELOG)
SLEEPTIME=5000 #edit this line to change timer, e.g. 2 hours "$((2*60*60))"
if [[ $1 == "resume" ]]
then
    if [[ $(date +%s) -ge $(( $ALARM + $SLEEPTIME )) ]]
    then
        echo "hibernate triggered $(date +%H:%M:%S)">>$TIMELOG
        systemctl hibernate 2>> $TIMELOG
    else
        echo "normal wakeup $(date +%H:%M:%S)">>$TIMELOG
    fi
elif [[ $1 == "suspend" ]]
then
    echo "$(date +%s)" >> $TIMELOG
    rtcwake -m no -s $SLEEPTIME
fi

तब systemd लक्ष्य बनाएं: # touch /etc/systemd/system/suspend-to-sleep.target इस सामग्री को चिपकाएँ:

#/etc/systemd/system/suspend-to-hibernate.service
[Unit]
Description=Delayed hibernation trigger
Before=suspend.target
Conflicts=hibernate.target hybrid-suspend.target
StopWhenUnneeded=true

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/bash /suspend.sh suspend
ExecStop=/bin/bash /suspend.sh wakeup

[Install]
WantedBy=sleep.target
RequiredBy=suspend.target

फिर इसे सक्षम करें # systemctl enable suspend-to-sleep.target

मुझे नोटबुक में से एक पर एक समस्या का सामना करना पड़ा है: समापन ढक्कन ने इस लक्ष्य को ट्रिगर नहीं किया। यह xfce4-power-manager के कारण था। इस समस्या को हल करने के दो तरीके हैं। पहले एक /etc/systemd/logind.confफ़ाइल को संपादित करना और उसके HandleLidSwitch=ignoreसाथ प्रतिस्थापित करना है HandleLidSwitch=suspend। लेकिन यह सिस्टमवाइड होगा, इसलिए मैंने सिर्फ अपनी स्क्रिप्ट में सिमिलिंक जोड़ा है# ln -s /suspend.sh /etc/pm/sleep.d/0000rtchibernate


1

एक और अधिक आम समाधान आप उपयोग कर सकते हैं hybrid-sleep(जैसे कि मैक ओएस करता है)। यदि आपका कंप्यूटर हाइबरनेशन का समर्थन करता है, तो आप इस सुविधा का उपयोग कर सकते हैं:

systemctl hybrid-sleep

उस कमांड को निलंबित करना चाहिए और कंप्यूटर को डिस्क (हाइबरनेट) पर भेजना चाहिए। कुछ समय बाद कंप्यूटर बंद हो जाएगा (चालू करते समय, यह हाइबरनेशन फ़ाइलों का उपयोग करेगा जागने के लिए)।

ps: मुझे पता है कि यह बिल्कुल नहीं है कि ओपी ने क्या पोस्ट किया है, लेकिन यह काफी करीब है


0

उस फ़ाइल को chmod + x करना न भूलें, इसे निष्पादन योग्य बनाएं।

Rtcwake के बिना एक और उपाय है, wakealarm in / sys / class / rtc / rtc0 का उपयोग करना। टिप्पणियों के बाद pm- फ़ंक्शंस (/ usr / lib / pm-utils) में अप्रचलित कोड का उपयोग करें। जब कर्नेल सीधे समर्थन नहीं करता है ..., ('वर्तमान कर्नेल (3.6 कुछ के बाद) सीधे समर्थन करता है)। उस कोड को वापस करें और do_suspend_hybrid () के बजाय do_suspend () भाग में डालें।

अप्रचलित कोड (सस्पेंड तब हाइबरनेट करें जब सस्पेंड_हाइब्रिड कहा जाता है):

# since the kernel does not directly support hybrid sleep, we do
# something else -- suspend and schedule an alarm to go into
# hibernate if we have slept long enough.
# Only do this if we do not need to do any special video hackery on resume
# from hibernate, though.
if [ -z "$SUSPEND_HYBRID_MODULE" -a -w "$PM_RTC/wakealarm" ] && \
    check_suspend && check_hibernate && ! is_set $HIBERNATE_RESUME_POST_VIDEO; \
    then
    SUSPEND_HYBRID_MODULE="kernel"
    do_suspend_hybrid() {
    WAKETIME=$(( $(cat "$PM_RTC/since_epoch") + PM_HIBERNATE_DELAY))
    echo >"$PM_RTC/wakealarm"
    echo $WAKETIME > "$PM_RTC/wakealarm"
    if do_suspend; then
        NOW=$(cat "$PM_RTC/since_epoch")
        if [ "$NOW" -ge "$WAKETIME" -a "$NOW" -lt $((WAKETIME + 30)) ]; then
        log "Woken by RTC alarm, hibernating."
        # if hibernate fails for any reason, go back to suspend.
        do_hibernate || do_suspend
        else
        echo > "$PM_RTC/wakealarm"
        fi
    else
        # if we cannot suspend, just try to hibernate.
        do_hibernate
    fi
    }
fi

सिफारिश की। यहां तक ​​कि बेकार का उपयोग करना आसान है, जबकि एक ही समय में s2both के लाभ को अधिकतम करें जब s2both को निलंबित करें। Do_suspend () uswsusp मॉड्यूल का हिस्सा (/usr/lib/pm-utils/module.d) में उल्टा कोड डालें।

उलटा कोड (सस्पेंड कहा जाता है जब निलंबित)

WAKETIME=$(( $(cat "$PM_RTC/since_epoch") + PM_HIBERNATE_DELAY))
echo >"$PM_RTC/wakealarm"
echo $WAKETIME > "$PM_RTC/wakealarm"
if do_suspend_hybrid; then
    NOW=$(cat "$PM_RTC/since_epoch")
    if [ "$NOW" -ge "$WAKETIME" -a "$NOW" -lt $((WAKETIME + 30)) ];             then
    log "Woken by RTC alarm, hibernating."
    # if hibernate fails for any reason, go back to suspend_hybrid.
    do_hibernate || do_suspend_hybrid
    else
    echo > "$PM_RTC/wakealarm"
    fi
else
    # when do_suspend is being called, convert to suspend_hybrid.
    do_suspend_hybrid
fi      

बेकार के साथ, हम सस्पेंड / हाइबरनेट की प्रगति और पाठ में प्रदर्शित रिवर्स प्रक्रिया को देख सकते हैं, यहां तक ​​कि हम इसे बैकस्पेस दबाकर भी निरस्त कर सकते हैं। यूजलेस के बिना, सस्पेंड / हाइबरनेट केवल नाराज-गायब दिखाई देते हैं, खासकर जब वैकलरम को ट्रिगर किया जाता है और हाइबरनेट को निष्पादित करता है (us2usp में s2disk)। Pm- फ़ंक्शंस फ़ाइल पर सामान्य स्थान पर हाइबरनेट से पहले सोने की अवधि निर्धारित करें।

# variables to handle hibernate after suspend support
PM_HIBERNATE_DELAY=900  # 15 minutes
PM_RTC=/sys/class/rtc/rtc0

यहाँ प्रयोग करने योग्य मॉड है: (याद रखें, इस मॉड्यूल को पीएम-फंक्शंस से बुलाया जाता है ताकि सम्मिलित चर समान हों)

#!/bin/sh

# disable processing of 90chvt and 99video.
# s2ram and s2disk handle all this stuff internally.
uswsusp_hooks()
{
    disablehook 99video "disabled by uswsusp"
}

# Since we disabled 99video, we need to take responsibility for proper
# quirk handling.  s2ram handles all common video quirks internally,
# so all we have to do is translate the HAL standard options to s2ram options.
uswsusp_get_quirks()
{
    OPTS=""
    ACPI_SLEEP=0
    for opt in $PM_CMDLINE; do
        case "${opt##--quirk-}" in # just quirks, please
            dpms-on)       ;; # no-op
            dpms-suspend)      ;; # no-op
            radeon-off)        OPTS="$OPTS --radeontool" ;;
            reset-brightness)  ;; # no-op
            s3-bios)       ACPI_SLEEP=$(($ACPI_SLEEP + 1)) ;;
            s3-mode)       ACPI_SLEEP=$(($ACPI_SLEEP + 2)) ;;
            vbe-post)      OPTS="$OPTS --vbe_post" ;;
            vbemode-restore)   OPTS="$OPTS --vbe_mode" ;;
            vbestate-restore)  OPTS="$OPTS --vbe_save" ;;
            vga-mode-3)        ;; # no-op
            save-pci)          OPTS="$OPTS --pci_save" ;;
            none)          QUIRK_NONE="true" ;;
            *) continue ;;
        esac
    done
    [ $ACPI_SLEEP -ne 0 ] && OPTS="$OPTS --acpi_sleep $ACPI_SLEEP"
    # if we were told to ignore quirks, do so.
    # This is arguably not the best way to do things, but...
    [ "$QUIRK_NONE" = "true" ] && OPTS=""
}

# Since we disabled 99video, we also need to handle displaying
# help info for the quirks we handle.
uswsusp_help()
{
    echo  # first echo makes it look nicer.
    echo "s2ram video quirk handler options:"
    echo
    echo "  --quirk-radeon-off"
    echo "  --quirk-s3-bios"
    echo "  --quirk-s3-mode"
    echo "  --quirk-vbe-post"
    echo "  --quirk-vbemode-restore"
    echo "  --quirk-vbestate-restore"
    echo "  --quirk-save-pci"
    echo "  --quirk-none"
}

# This idiom is used for all sleep methods.  Only declare the actual
# do_ method if:
# 1: some other sleep module has not already done so, and
# 2: this sleep method can actually work on this system.
#
# For suspend, if SUSPEND_MODULE is set then something else has already
# implemented do_suspend.  We could just check to see of do_suspend was
# already declared using command_exists, but using a dedicated environment
# variable makes it easier to debug when we have to know what sleep module
# ended up claiming ownership of a given sleep method.
if [ -z "$SUSPEND_MODULE" ] && command_exists s2ram && \
    ( grep -q mem /sys/power/state || \
        ( [ -c /dev/pmu ] && check_suspend_pmu; ); ); then
    SUSPEND_MODULE="uswsusp"
    do_suspend()
    {
        WAKETIME=$(( $(cat "$PM_RTC/since_epoch") + PM_HIBERNATE_DELAY))
        echo >"$PM_RTC/wakealarm"
        echo $WAKETIME > "$PM_RTC/wakealarm"
        if do_suspend_hybrid; then
            NOW=$(cat "$PM_RTC/since_epoch")
            if [ "$NOW" -ge "$WAKETIME" -a "$NOW" -lt $((WAKETIME + 30)) ];             then
            log "Woken by RTC alarm, hibernating."
            # if hibernate fails for any reason, go back to suspend_hybrid.
            do_hibernate || do_suspend_hybrid
            else
            echo > "$PM_RTC/wakealarm"
            fi
        else
            # when do_suspend is being called, convert to suspend_hybrid.
            do_suspend_hybrid
        fi      
    }
fi

if [ -z "$HIBERNATE_MODULE" ] && \
    [ -f /sys/power/disk ] && \
    grep -q disk /sys/power/state && \
    [ -c /dev/snapshot ] &&
    command_exists s2disk; then
    HIBERNATE_MODULE="uswsusp"
    do_hibernate()
    {
        s2disk
    }
fi

if [ -z "$SUSPEND_HYBRID_MODULE" ] && 
    grep -q mem /sys/power/state && \
    command_exists s2both && \
    check_hibernate; then
    SUSPEND_HYBRID_MODULE="uswsusp"
    do_suspend_hybrid()
    {   
        uswsusp_get_quirks
        s2both --force $OPTS 
    }
    if [ "$METHOD" = "suspend_hybrid" ]; then
        add_before_hooks uswsusp_hooks
        add_module_help uswsusp_help
    fi
fi  
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.