Suspend'den Hazırda Bekletme moduna otomatik olarak nasıl geçilir?


53

Ubuntu'nun "Suspend Sedation" adlı Suspend'ten Hazırda Bekletme durumuna geçmesi mümkün müdür?

Aradığım şey şuydu:
Kapağı kapattığımda, dizüstü bilgisayar Suspend'e yerleştiriliyor. Daha sonra, hala kullanmıyorsam, önceden belirlenmiş bir süreden sonra (pil güçleniyorsa bile), pil gücünden tasarruf etmek için kendisini Hazırda Bekletme moduna almalıdır.

Örneğin, dizüstü bilgisayar kapağını kapattığımda bir Askıya almak üzere ayarlandı. O zaman bütün gün kullanmazsam, batarya boşalır, çünkü askıya alma modunda bile donanım hala az miktarda güç tüketir ve batarya sonunda boşalır. İstediğim şey, Ubuntu'ya askıya alınsa bile, birkaç saat kullanılmadığında Hazırda Bekletme moduna girmesi gerektiğini söyleyebilmek.

Windows bunu yapabilir. Ubuntu zamanlayıcıda Bekleme veya Hazırda Bekletme moduna girecek şekilde programlanabilir , ancak her ikisi de değil.


Araştırmamda aynı Linux Mint dizisini buldum, ancak "Suspend Sedation" bu özellik için resmi bir Microsoft terimi değildir ve söyleyebileceğim kadarıyla, bahsettiğim kadarıyla, bahsettiğim Linux Mint forum kullanıcısı tarafından icat edildi.
ayan4m1

Bu özellik için daha iyi bir isim var mı?
Sergey Stadnik

Söyleyebileceğim kadarıyla, bu özellik için evrensel olarak kabul edilmiş bir isim yok. "Hibrit askıya alma" bazıları tarafından, "askıya alma askıya alma", bir Linux Mint forum kullanıcısı tarafından kullanılıyor ve daha önce işleme başvurmak için kullanılan "hazırda bekleme ve askıya alma" öğelerini duydum. Microsoft resmen en azından Windows 7 için "karma uyku" olarak bahsetmektedir.
ayan4m1

2
@ ayan4m1 Bunun eski bir soru olduğunun farkındayım, ancak bunu açıklığa kavuşturmanın önemli olduğunu düşünüyorum. Hibrit uyku, "Uyku sonra belirli bir süre sonra hazırda bekletme" ile aynı değildir. Hibrit uyku, pilin bitmesiyle elektrik kesildiğinde hazırda bekleme moduna geçer. OP tarafından açıklanan davranış, Hibrit Uyku ayarının etkinleştirilmesini gerektirmez.
Paul

Yanıtlar:


20

In Ubuntu 18.04 çok daha kolay. Gelen systemd yeni mod kullanılabilir askıya-o-hazırda bekleme . Bu işlevi kullanmaya başlamak için sonraki içeriğe sahip bir /etc/systemd/sleep.conf dosyası oluşturmanız gerekir :

[Sleep]
HibernateDelaySec=3600

Sonra komutla test edebilirsiniz:

sudo systemctl suspend-then-hibernate

HibernateDelaySecHazırda bekletme süresini azaltmak için düzenleyebilirsiniz .


Her şey yolunda giderse , Lid Close Action özelliğini değiştirebilirsiniz, bunun için /etc/systemd/logind.conf dosyasını düzenlemeniz gerekir.

Bir seçenek bulmanız HandleLidSwitch=, yorumunu kaldırmanız ve değiştirmeniz gerekiyor HandleLidSwitch=suspend-then-hibernate. Daha sonra bir sonraki komutla systemd-logind servisini yeniden başlatmanız gerekir (uyarı! Kullanıcı oturumunuz yeniden başlatılır):

sudo systemctl restart systemd-logind.service

Bu kadar! Şimdi bu güzel işlevi kullanabilirsiniz.


Bu nokta oldu. Pop! _OS 18.10 (aka Ubuntu 18.10) üzerinde kullanma.
eduncan911

Harika, teşekkür ederim! Sleep.conf hazırda bekleme modunu da bir şekilde etkiler mi, yoksa yalnızca askıda bırak ve sonra hazırda bekletme modunu etkiler mi?
user2428107

@ user2428107, systutorials.com/docs/linux/man/5-systemd-sleep adresindeki seçenekler hakkında bilgi alabilirsiniz
PRIHLOP

35

Bunun çözümü basit. İlk olarak, askıya alma ve devam ettirme sonrasında, pm-askıya alma programı /etc/pm/sleep.dve içerisinde bir dizi komut dosyası çalıştırır /usr/lib/pm-utils/sleep.d. Bu yüzden benim çözümüm aşağıdakileri yapan bir komut dosyası eklemektir:

  1. Askıya alındıktan sonra, geçerli saati kaydedin ve rtcwake kullanarak bir uyandırma olayı kaydedin.
  2. Devam ettirildiğinde, geçerli saati yukarıdan kaydedilmiş zamana göre kontrol edin. Yeterli zaman geçerse, muhtemelen rtc timer olayı nedeniyle uyandık. Aksi takdirde bir kullanıcı olayı nedeniyle (dizüstü bilgisayar ekranını açmak gibi) erken uyandık.
  3. RTC zamanlayıcısı nedeniyle uyanırsak, hemen hazırda bekletme moduna geçmek için hemen "pm-hibernate" komutunu verin.

İşte bunu yapan bir script. Onu adlandırın 0000rtchibernateve /etc/pm/sleep.ddizine yerleştirin (0000 önemlidir, böylece komut dosyası askıya alınma işleminde ilk önce ve devam ettirme işleminde en son çalıştırılır).

#!/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

Umarım bu kod bu mesaj panosundan gelir (buradaki ilk yayınım).

autohibernate=7200En üstteki zaman aşımı değerini , hazırda bekletme moduna girmeden önce ne kadar uyuyacağınızla ancak birkaç saniye boyunca düzenleyin. Mevcut değer 2 saat. Dizüstü bilgisayarınızın, hazırda bekleme işlevini yürütürken, birkaç saniye boyunca uyanacağını unutmayın.

Öyleyse dizüstü bilgisayarınızı bir kasaya yerleştirmeyi planlıyorsanız, askıya almayın; Aksi taktirde dizüstü bilgisayarınız esp. eğer sıkı bir kayma durumundaysa (sadece bir kaç dakika ila bir dakika kadar açık olmasına rağmen).

Bu yöntemi son birkaç gündür kullanıyorum, şimdiye kadar başarılı oldu (ve bu öğleden sonra beni ölü bir bataryadan kurtardı). Keyfini çıkarın.

systemdKullanan ve daha yeni Ubuntu sürümleri kullanan diğer Linux dağıtımları için , komut dosyasını /usr/lib/systemd/system-sleepyerine yerleştirirseniz, bu yine de çalışmalıdır /etc/pm/sleep.d. Ayrıca, /usr/sbin/pm-hibernatekomutu ile değiştirin systemctl hibernate.


Burada çalıştı, ancak ben sadece herkese X eklemek için dosyayı chmod sonra. Ben büyük bir acemiyim ve bunu bulmam 2 günümü aldı. Çok iyi senaryo ve umarım bu, kimin problemi olursa olsun yardımcı olur. Teşekkür ederim.

2
Bu yararlı bir Ubuntu / Debian paketi yapar!
Petr Pudlák

Merak ediyorum: bu hala Ubuntu 13.04 için geçerli olur mu? Tam olarak bu çözüme ihtiyacım var ama daha yeni sürümlerde bir şeyler kırılırsa karının laptopuyla uğraşmak istemiyorum.
Torben Gundtofte-Bruun'da

Senaryo için teşekkürler. Ubuntu 14.04'te benim için iyi çalışıyor! Bir gelişme, dizüstü bilgisayar hazırda bekleme moduna geçtiğinde uyandığında, AC gücüne takılı olup olmadığını kontrol edebilecekse olacaktır. Öyleyse, hazırda bekletme yerine tekrar askıya alınmasını isterdim. Hazırda bekletme modundan geri yükleme işlemi daha uzun sürüyor ve fişe takılı olduğunda kış uykusu için gerçekten ihtiyacım yok ...
maddentim

Çok teşekkür ederim!!!! Bu senaryo hayal ettiğim sihir !!
yanpas

12

Bunun nasıl çalıştığını (bu, Windows'a benzer) basit bir şekilde açıklamak için: pil, makine durumunu değiştirilebilir bölüme kaydedebilmek için düşük olduğunda makine bekleme modundan kalkmaz, hemen her şeyi değiştirme bölümüne kaydeder bekleme modundayken ve pil bittiğinde, takas bölümünden durumu yükleyerek bu durumu kurtarır (hazırda bekletme durumunda olduğu gibi).

AFAIK linux, donanımınız için çalıştığını bilirse "normal" bekleme yerine hibrit bekleme / hazırda bekletme modunu kullanır / kullanmalıdır. Ayrıca, şu anda çok fazla hata veya başka bir şey yüzünden devre dışı bırakılması da mümkün.

Denemeyi seviyorsanız, belki pm-suspend-hybrid ile iyi sonuçlar alıp alamayacağınızı görebilirsiniz .

Aşağıdakiler şanslı olduğunuzu söylüyorsa, teoride hibrit askıya alma sisteminizde desteklenir:

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

1
Kabuk komutundaki tek kesme işareti yanıltıcı ve kafa karıştırıcı olabilir ... lütfen kaçış.
ayan4m1

1
Bah, başka bir metnin içine gömülü bir komut satırını komut satırı olarak düşünmeden düzenlediğinizde gerçekleşen de budur… Thanks & Fixed.
Ocak

Hiç sorun değil, evet, iki işlem için farklı başlıklar hakkında anladım.
ayan4m1

6

S2both ile ilginizi çekebilir . uswsuspUbuntu 10.10'daki paket tarafından sağlanmaktadır . Diski askıya alır, ancak sistemi kapatmak yerine, genellikle Ubuntu'da "Askıya Al" seçeneğiyle ilişkilendirilen güç modu olan S3'e yerleştirir. pm-suspend-hybrid aynı şeyi yapma iddiasında olan başka bir araçtır.

Bunu kapakta otomatik hale getirmek için, bir kapak olayı yakalandığında rastgele bir komut dosyası çalıştırmanıza izin veren aşağıdaki kılavuza bakın:

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

Bir ThinkPad'iniz varsa, manpage tpctl, --pm-sedation-hibernate-from-suspend-timeraradığınız özelliği sağladığı için bir argümana atıfta bulunur . Bunu ThinkPad olmayan donanımlarda denemeye karşı uyarırdım.

Başvuru için, hibernate.conf ; Herhangi bir seçenek var gibi görünmüyordu ancak ikinci bir okumaya değebilirdi.


5

Ubuntu 16.04 - önceden belirlenen bir süre sonunda askıya alma / uyku modundan uyku moduna geçme

Görünüşe göre Ubuntu 16.04'te işler biraz farklı, bu yüzden çalışması için attığım adımlar şunlardı:

  1. Hazırda bekletme modunun çalışırken beklendiği gibi çalıştığından emin olun.

    systemctl hibernate
    
  2. Orijinal suspend.targetdosyayı kopyala :

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

    Ardından dosyayı düzenleyin /etc/systemd/system/suspend.targetve satırı ekleyin:

    Requires=delayed-hibernation.service
    

    için [Unit]bu dosyanın bölümünde.

  3. /etc/systemd/system/delayed-hibernation.serviceAşağıdaki içerikle dosyayı oluşturun :

[Birim]
Açıklama = Gecikmeli hazırda bekleme tetikleyicisi
= Suspend.target önce
Çakışmalar = hibernate.target hybrid-suspend.target
StopWhenUnneeded = true

[Hizmet]
= Oneshot yazın
RemainAfterExit = yes
ExecStart = / usr / local / bin / delayed -hibernation.sh askıya alma öncesi
ExecStop = / usr / local / bin / delayed -hibernation.sh yayınlamayı durdur

[Yüklemek]
WantedBy = sleep.target
  1. /etc/delayed-hibernation.confAşağıdaki içerikle kod için yapılandırma dosyasını oluşturun :
# 'Delayed-hibernation.sh' betiği için yapılandırma dosyası

# Bilgisayar hazırda bekleme moduna geçmeden önce uyku modunda geçirilecek süreyi saniye cinsinden belirtin
TIMEOUT = 1200 # saniye, 20 dakika verir
  1. Zor işi gerçekten yapacak olan betiği oluşturun.

    /usr/local/bin/delayed-hibernation.shİçeriği olan dosya oluştur :

#! / Bin / bash
# Komut dosyası adı: delayed-hibernation.sh
# Amaç: Bir uyku süresinden sonra otomatik hazırda bekleme
# Uyulacak saniye sayısını ayarlamak için `$ hibernation_conf` dosyasındaki` TIMEOUT` değişkenini düzenleyin.

hibernation_lock = '/ var / çalıştırma / gecikmeli hibernation.lock'
hibernation_fail = '/ var / run / delayed-hibernation.fail'
hibernation_conf = / etc / gecikmeli hibernation.conf '

# Yapılandırma dosyasını kontrol ediyorum
Eğer [ ! -f $ hibernation_conf]; sonra
    echo "Yapılandırma dosyası eksik ('$ hibernation_conf'), iptal ediliyor."
    çıkış 1
fi
hibernation_timeout = $ (grep "^ [^ #]" $ hibernation_conf | grep "TIMEOUT =" | awk -F '=' '{print $ 2}' | awk -F '#' '{print $ 1}' | tr -d '[[\ t]]')
eğer ["$ hibernation_timeout" = ""]; sonra
    echo "Yapılandırma dosyasındaki ('$ hibernation_conf') eksik olan 'TIMEOUT' parametresini iptal ediyor."
    çıkış 1
elif [[! "$ hibernation_timeout" = ~ ^ [0-9] + $]]; sonra
    echo "yapılandırma dosyasında" Bad 'TIMEOUT' parametresi ('$ hibernation_timeout') ('$ hibernation_conf'), beklenen saniye sayısı iptal edildi. "
    çıkış 1
fi

# Verilen parametrelerin işlenmesi
if ["$ 2" = "askıya alma"]; sonra
    bitirme süresi = $ (tarih +% s)
    if ["$ 1" = "pre"]; sonra
        if [-f $ hibernation_fail]; sonra
            echo "Hatalı hazırda bekletme modu algılandı, RTC uyandırma zamanlayıcısı ayarını atlayarak"
        Başka
            echo "Askıya alındı ​​belirlendi. Kayıt süresi, RTC zamanlayıcısını ayarlayın"
            echo "$ curtime"> $ hibernation_lock
            rtcwake -m no -s $ hibernation_timeout
        fi
    elif ["$ 1" = "yayın"]; sonra
        if [-f $ hibernation_fail]; sonra
            rm $ hibernation_fail
        fi
        if [-f $ hibernation_lock]; sonra
            sustime = $ (cat $ hibernation_lock)
            rm $ hibernation_lock
            if [$ (($ curtime - $ sustime))) -ge $ hibernation_timeout]; sonra
                echo "Askıya alma işleminden otomatik devam algılandı. Hazırda bekletme ..."
                systemctl hazırda bekleme
                eğer [$? -ne 0]; sonra
                    echo "Otomatik hazırda bekletme modu başarısız oldu. Bunun yerine askıya alınmaya çalışılıyor."
                    $ hibernation_fail öğesine dokunun
                    systemctl askıya alma
                    eğer [$? -ne 0]; sonra
                        echo "Otomatik hazırda bekleme ve askıya alma işlemini askıya alma işlemi başarısız oldu. Denenecek başka bir şey yok."
                    fi
                fi
            Başka
                echo "El ile askıya alma işlemi askıya alındı. RTC zamanlayıcısının temizlenmesi"
                rtcwake -m devre dışı bırak
            fi
        Başka
            echo "Dosya '$ hibernation_lock' bulunamadı, yapılacak hiçbir şey yok '
        fi
    Başka
        echo "Tanınmayan ilk parametre: '$ 1', beklenen 'pre' veya 'post'"
    fi
Başka
    echo "Bu betiğin systemctl delay-hibernation.service tarafından çalıştırılması amaçlanmıştır (beklenen ikinci parametre: 'suspend')"
fi
  1. Komut dosyasını yürütülebilir duruma getirin:
chmod 755 / usr/local/bin/delayed-hibernation.sh

Bu betiği, bu konudaki diğer cevaplara dayanarak, https://bbs.archlinux.org/viewtopic.php?pid=1554259 gibi internette bulduğum şeylere dayanarak yazmam çok uzun sürdü.

Benim senaryomun sürümü, kış uykusu başarısız olursa tekrar askıya alınma gibi birçok sorunla uğraşmaya çalışır, ancak önceden belirlenmiş bir süre sonra tekrar uyanmaz.

  1. Sanırım son adım sadece yürütmek olacaktır

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

    yeni servis / yapılandırmaların kullanıldığından emin olmak için.

Servis kaydını kontrol etmek için şunları kullanabilirsiniz:

sudo systemctl durumu gecikmeli-hibernation.service

veya hizmet kullanımının tam bir kaydı için:

sudo journalctl -u gecikti-hibernation.service

Çalışan hizmetten aldığım normal bir günlük:

mile @ mile-ThinkPad: ~ $ sudo systemctl durumu ertelendi-hibernation.service 
● delay-hibernation.service - Gecikmeli hazırda bekleme tetikleyicisi
   Yüklendi: yüklü (/etc/systemd/system/delayed-hibernation.service; etkin; satıcı ön ayarı: etkin)
   Aktif: etkin değil (ölü)

Jun 09 20:35:42 mile-ThinkPad systemd [1]: Gecikmeli hazırda bekletme modunun başlatılması ...
Jun 09 20:35:42 mile-ThinkPad ertelendi-hibernation.sh [2933]: Askıya alma tespit edildi. Kayıt süresi, RTC zamanlayıcısını ayarlayın
Jun 09 20:35:42 mile-ThinkPad ertelendi-hibernation.sh [2933]: rtcwake: RTC’nin UTC kullandığını varsayarsak ...
Jun 09 20:35:42 mile-ThinkPad gecikti-hibernation.sh [2933]: rtcwake: Perşembe 9 Haziran’da / dev / rtc0 kullanarak uyandırma 18 18:55:43 2016
Jun 09 20:55:44 mile-ThinkPad systemd [1]: Gecikmeli Hazırda Bekletme modunu başlattı.
Jun 09 20:55:44 mil-ThinkPad sistemi [1]: delay-hibernation.service: Ünite artık gerekli değil. Durduruluyor.
Jun 09 20:55:44 mil-ThinkPad sistemi [1]: Gecikmeli hazırda bekletme modunun durdurulması ...
Jun 09 20:55:44 mile-ThinkPad gecikti-hibernation.sh [3093]: Askıya alma işleminden otomatik olarak devam edildi. Kış uykusuna yatan ...
Jun 09 20:55:44 mil-ThinkPad sistemi [1]: Gecikmeli Hazırda Bekletme modunu durdurdu.
mil @ mil ThinkPad: ~ $ 

Yani bu olur, umarım gerçekten çok yardımcı olur, çünkü bu kullanışlı özelliği çalıştırmak için doğru yapılandırma ve senaryo versiyonlarını bulmak için günlerimi harcadım.


Cevabınız için teşekkürler, bu hala Ubuntu 18.04 tarihinde bir cazibe gibi çalışıyor. Yukarıdaki yanıtları işe alamadım /bin/systemctl hibernate, komut satırında düzgün çalışsa bile, systemd betiğinde çalışırken yürütme her zaman 1 değerini döndürür.
eugenhu

4

Sadece bir şeylerin yanlış gitmesi durumunda pm-hibernate, bilgisayarın çalışmasına izin vermek yerine askıya alınmasını tercih ederim. Yani kullanabilirsiniz:

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

3

İşte Derek Pressnall'ın systemd ile çalışan ve Eliah Kagan'ın önerisini içeren yanıtının güncellenmiş bir sürümü : /usr/lib/systemd/system-sleep/delayed_hibernation.sh dosyasına bırakın ve çalıştırılabilir hale getirin:

#!/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

Bu, 15.10'da birkaç ay boyunca harika çalışıyordu, ancak 16.04 ile ilgili bir şey, komut dosyası hala çalışsa bile hazırda bekletme modunu önlüyor.
Sean,

@Sean bu konudaki geçici çözümü denediniz mi?
Niccolò Maggioni

Beni doğru yöne çevirdiğin için teşekkürler. Yukarıdaki betiğe başvuru yapan bir systemd hizmeti (/etc/systemd/system/delayed-hibernation.service) daha sonra /etc/systemd/system/suspend.target 'i gecikmeli-hibernation.service gerektirecek şekilde değiştirdim.
Sean,

2

İşte tarifim (iki dizüstü bilgisayarda Ubuntu 16.04 üzerinde test edilmiştir):

Bu betiği istediğiniz yere yerleştirin (root'a koydum /syspend.sh) ve çalıştırılabilir hale getirin ( 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

Ardından sistemd hedefi oluşturun: # touch /etc/systemd/system/suspend-to-sleep.target Bu içeriği yapıştırın:

#/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

O zaman etkinleştir # systemctl enable suspend-to-sleep.target.

Dizüstü bilgisayarlardan birinde bir sorunla karşılaştım: kapama kapağı bu hedefi tetiklemedi. Bunun nedeni xfce4-power-manager idi. Bu sorunu çözmek için iki yol vardır. İlki düzenlemektir /etc/systemd/logind.confdosyayı ve değiştirme HandleLidSwitch=ignoreile HandleLidSwitch=suspend. Fakat sistem çapında olacak, bu yüzden senaryomuza bir link ekledik# ln -s /suspend.sh /etc/pm/sleep.d/0000rtchibernate


1

Kullanabileceğiniz daha başka bir geçici çözüm hybrid-sleep(Mac OS'de olduğu gibi). Bilgisayarınız hazırda bekletme modunu destekliyorsa, bu özelliği kullanabilirsiniz:

systemctl hybrid-sleep

Bu komut, bilgisayarı askıya almalı ve diske (hazırda bekletme) göndermelidir. Bir süre sonra bilgisayar kapanacaktır (açarken, hazırda bekletme dosyalarını uyandırmak için kullanır).

ps: OP'nin yayınladığı şey değil, biliyorum ama oldukça yakın.


0

Bu dosyayı chmod + x komutlarını çalıştırmayı unutmayın.

/ Sys / class / rtc / rtc0 dizininde wakealarm kullanan rtcwake'siz başka bir çözüm var. Çekirdeklerin doğrudan desteklemediği için #since (/ usr / lib / pm-utils) pm-işlevlerinde (/ usr / lib / pm-utils) eski kodu kullanın. Bu kodu geri alın ve do_suspend_hybrid () yerine do_suspend () bölümüne koyun.

Eski kod (suspend_hybrid çağrıldığında askıya alın ve sonra hazırda bekletme):

# 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

Önerilen. Uswsusp kullanmak daha da kolayken, aynı zamanda s2both'un yani s2both'un askıya alınma şeklindeki faydasını maksimuma çıkarır. Döndürülen kodu, uswsusp modülünün do_suspend () bölümüne (/usr/lib/pm-utils/module.d) koyun.

Geri döndürülen kod (askıya alma çağrıldığında askıya alınma tarihi):

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      

Uswsusp ile, askıya alma / hazırda bekletme işleminin ilerlemesini ve metinde görüntülenen ters işlemi görebiliriz, hatta geri tuşuna basarak iptal edebiliriz. Uswsusp olmadan, askıya alma / hazırda bekletme modu, özellikle wakealarm tetiklendiğinde ve hazırda bekletme modunu çalıştırdığında (uswsusp'ta s2disk) can sıkıcı bir şekilde görünür. Uykuya dalmadan önce uyku süresini, pm-Fonksiyonları dosyasındaki normal bir yerde ayarlayın.

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

Uswsusp kipi: (unutma, bu modül pm-işlevlerinden çağrılır, böylece eklenen değişkenler aynıdır)

#!/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  
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.