ฉันจะใช้ pm-suspend-hybrid โดยค่าเริ่มต้นแทน pm-suspend ได้อย่างไร


41

ฉันต้องการใช้วิธีการระงับแบบไฮบริดแทนการระงับเมื่อปิดฝาหรือเลือก "ระงับ" จากเมนู

ฉันสามารถจินตนาการได้ว่าจะเปลี่ยนสคริปต์ pm-suspend ให้ทำโดยอัตโนมัติ แต่อาจมีวิธีที่บำรุงรักษา / ง่ายกว่า

คำตอบ:


44

ไฮบริดสลีทางอ้อม

นี่เป็นวิธีที่เก่ากว่า: ก่อนอื่นให้หยุดชั่วคราวแล้วตื่นขึ้นมาถึงโหมดไฮเบอร์เนตหลังจากเกิดความล่าช้า (โดยค่าเริ่มต้น 15 นาที) ใช้สิ่งนี้กับเคอร์เนล Linux ก่อน 3.6 หรือถ้าคุณชอบที่มันไม่ได้ใช้พลังงานใด ๆ หลังจาก 15 นาทีอีกต่อไป

เพิ่มไฟล์/etc/pm/config.d/00-use-suspend-hybrid:

# Always use suspend_hybrid instead of suspend
if [ "$METHOD" = "suspend" ]; then
  METHOD=suspend_hybrid
fi
# The delay after which hibernation gets triggered (default: 900 seconds, 15 minutes):
PM_HIBERNATE_DELAY=900

คุณอาจต้องการตรวจสอบให้แน่ใจว่าวิธีการไฮบริดได้รับการสนับสนุนในระบบของคุณผ่านรหัสต่อไปนี้ ถ้ามันบอกว่า "0" มันควรจะทำงาน:

sudo pm-is-supported --suspend-hybrid && echo $?

ไฮบริดจริงหยุดทำงานชั่วคราวกับ Linux 3.6+

หากคุณมีเคอร์เนล Linux 3.6 คุณสามารถใช้สิ่งต่อไปนี้ซึ่งจะระงับทั้งดิสก์และ RAM ตั้งแต่เริ่มต้น

เพิ่มไฟล์/etc/pm/config.d/00-use-suspend-hybrid:

# WORKAROUND: always set the default hibernate mode first (normal mode)
# (not required if you have the patch mentioned by Rohan below (http://askubuntu.com/a/344879/169))
HIBERNATE_MODE=platform

# Always use hibernate instead of suspend, but with "suspend to both"
if [ "$METHOD" = "suspend" ]; then
  METHOD=hibernate
  HIBERNATE_MODE=suspend
fi

# Make sure to use the kernel's method, in case uswsusp is installed etc.
SLEEP_MODULE=kernel

การดำเนินการนี้จะเขียนรูปภาพไปยังดิสก์จากนั้นหยุดการทำงานของ RAM ชั่วคราวประโยชน์ที่ได้รับจะกลับมาทำงานได้อย่างรวดเร็ว (ตราบใดที่แบตเตอรี่ไม่หมด) และเครื่องจะไม่ปลุกในเวลาอันสั้น (หลังจาก PM_HIBERNATE_DELAY) ที่จะจำศีลจริง

ข้อเสียคือกระบวนการใช้เวลานานขึ้น (เพราะจะจำศีลเสมอในดิสก์) และแบตเตอรี่ของคุณอาจหมดในระยะยาว (เช่นหลังจากผ่านไป 12 ชั่วโมง)


2
โน้ตตัวเล็กหนึ่งตัวแทนที่จะใช้ 'sudo pm-is-support --suspend-hybrid && echo $?' ให้ใช้ 'sudo pm-is-support --suspend-hybrid; echo $? ' เนื่องจากค่าส่งคืนของ pm-is-support คือ 0 สำหรับได้รับการสนับสนุนและ 1 สำหรับไม่ใช่
James Caccese

1
@JamesCaccese: ในโลก shellscript, 0 หมายถึง "true" และสิ่งอื่น ๆ หมายถึง "false" สคริปต์เล็ตของคุณจะใช้งานได้ แต่สคริปต์ต้นฉบับของโปสเตอร์จะทำงานตามที่คาดไว้เช่นกันโดยพิมพ์ '0' ลงบนอุปกรณ์ที่รองรับและไม่สนับสนุนอะไรเลย หากคุณต้องการบางสิ่งที่จะพูดว่าสนับสนุนหรือไม่ได้รับการสนับสนุนให้ลอง 'sudo pm-is-support --suspend-hybrid && echo "สนับสนุน" || echo "ไม่สนับสนุน" '
zanfur

@zanfur - ในขณะที่ฉันชอบโซลูชันที่ให้มาของคุณสำหรับการพิมพ์ทั้งสองสถานะ (และไม่มีสิ่งใดสำหรับเหตุผลที่คาดไม่ถึงที่สนับสนุนPM ไม่ทำงานตามที่คาดไว้ซึ่งจะทำสิ่งที่ไม่ทราบสถานะข้อผิดพลาด ) ข้อแม้นั้นด้วยเหตุผลข้างต้น
user66001

หากคุณกำลังใช้ 16.04 เห็นนี้คำตอบด้านล่าง
kapad

เพียงชิ้นเดียวที่ขาดหายไปสำหรับฉันคือการโต้แย้งในresume /etc/default/grub.confนอกจากนี้ยังเป็นผู้ใช้ NVIDIA nomodesetผมต้องชุด ดังนั้นรายการด้วงที่เกิดขึ้นในกรณีของฉันคือ: GRUB_CMDLINE_LINUX_DEFAULT="nomodeset resume=UUID=uuidofswappartition". grub-updateอย่าลืม และยังมีบางโมดูลจะต้องมีการยกเลิกการโหลดเพื่อสร้างไฟล์/etc/pm/config.d/00-unload_modulesที่มีสายSUSPEND_MODULES="ath5k r8169"และเพียงเพื่อให้แน่ใจว่าฉันยังเปลี่ยนชื่อ 00-use-ระงับไฮบริดที่จะ10-use-suspend-hybrid
mauron85

31

Ubuntu 18.04 ตัวเลือกหมดเวลา

ในUbuntu 18.04มีตัวเลือกหมดเวลาใหม่ ในsystemdเป็น availiable suspend-then-hibernateโหมดใหม่ สิ่งนี้จะเริ่มต้นด้วยโหมดสลีปจากนั้นเปลี่ยนเป็นโหมดไฮเบอร์เนตหลังจากเวลาที่กำหนด

ในhybrid-sleepโหมดชิ้นส่วนจำศีลจะมีผลก็ต่อเมื่อแบตเตอรี่เหลือน้อยและระบบปิดตัวลง

ในการเริ่มใช้งานฟังก์ชั่นนี้คุณต้องสร้างไฟล์ที่/etc/systemd/sleep.confมีเนื้อหาถัดไป:

[Sleep]
HibernateDelaySec=3600

สิ่งนี้จะเปลี่ยนจากการนอนหลับเป็นการไฮเบอร์เนตหลังจากผ่านไป 1 ชั่วโมง คุณสามารถแก้ไขHibernateDelaySecเพื่อเปลี่ยนความล่าช้าในการจำศีล

ขั้นแรกให้ทดสอบว่า suspend-then-hibernate ทำงานได้หรือไม่โดยใช้ systemd

เปิดเทอร์มินัลโดยกดCtrl+ Alt+ Tและป้อน:

sudo systemctl suspend-then-hibernate

ถ้ามันใช้งานได้จะทำให้มันถาวร

  • ต่อไปนี้จะทำงานเมื่อผมปิดฝา

เปิดไฟล์/etc/systemd/logind.confโดยใช้โปรแกรมแก้ไขที่คุณต้องการ คุณจะต้องเรียกใช้อำนาจบริหารของคุณโดยการsudo, gksudoหรือpkexecแก้ไขไฟล์นี้

ค้นหาสองบรรทัด:

#HandleSuspendKey=suspend
#HandleLidSwitch=suspend

หมายเหตุ, บรรทัดเหล่านี้จะใส่เครื่องหมาย#ไว้ข้างหน้า suspendคือการกระทำเริ่มต้น ลบ#และเปลี่ยนsuspendเป็นsuspend-then-hibernateสองบรรทัดเพื่อให้เป็นดังนี้:

HandleSuspendKey=suspend-then-hibernate
HandleLidSwitch=suspend-then-hibernate

บันทึกไฟล์ ออกจากระบบและเข้าสู่ระบบใหม่หรือเริ่มlogindบริการโดยคำสั่ง:

systemctl restart systemd-logind.service

คำเตือน! เซสชันผู้ใช้ของคุณจะถูกรีสตาร์ท

ที่มา: ปิดฝาระงับแล้วไฮเบอร์เนต

Ubuntu 16.04 ขึ้นไป

วิธีการแก้ปัญหาโดยblueyed สำหรับไฮบริดจริงระงับกับ Linux 3.6 ขึ้นไปไม่ได้สำหรับผม ฉันสงสัยว่านี้เป็นเพราะ Ubuntu 16.04 การใช้และไม่ใช้ไฟล์systemd/etc/pm/config.d/00-use-suspend-hybrid

ก่อนอื่นให้ทดสอบว่าโหมดไฮเบอร์เนตและไฮบริดทำงานโดยใช้ systemd หรือไม่

เปิดเทอร์มินัลโดยกดCtrl+ Alt+ Tและป้อน:

sudo systemctl hibernate

สิ่งนี้จะทำให้คอมพิวเตอร์ของคุณจำศีล หากต้องการลองไฮบริดสลีปให้ป้อน:

sudo systemctl hybrid-sleep

ถ้ามันใช้งานได้จะทำให้มันถาวร

  • ต่อไปนี้จะทำงานเมื่อผมปิดฝา

เปิดไฟล์/etc/systemd/logind.confโดยใช้โปรแกรมแก้ไขที่คุณต้องการ คุณจะต้องเรียกใช้อำนาจบริหารของคุณโดยการsudo, gksudoหรือpkexecแก้ไขไฟล์นี้

ค้นหาสองบรรทัด:

#HandleSuspendKey=suspend
#HandleLidSwitch=suspend

หมายเหตุ, บรรทัดเหล่านี้จะใส่เครื่องหมาย#ไว้ข้างหน้า suspendคือการกระทำเริ่มต้น ลบ#และเปลี่ยนsuspendเป็นhybrid-sleepสองบรรทัดเพื่อให้เป็นดังนี้:

HandleSuspendKey=hybrid-sleep
HandleLidSwitch=hybrid-sleep

บันทึกไฟล์ ออกจากระบบและกลับเข้าสู่ระบบ

บันทึก:

  • นอกเหนือจากsuspendหรือhybrid-sleepมีตัวเลือกที่สาม, hibernate.
  • แล็ปท็อปของฉันไม่มีปุ่มสลีปทางกายภาพ ดังนั้นฉันไม่สามารถทดสอบได้
  • การคลิกที่Suspendจากจากเมนูฟันเฟืองจะทำให้คอมพิวเตอร์เข้าสู่โหมด suspend ปกติไม่ใช่ไฮบริดสลีป

ที่มา: https://superuser.com/questions/719447/how-to-use-systemd-hybrid-sleep-instead-of-suspend-under-gnome-in-linux

ฉันหวังว่านี่จะช่วยได้


2
คำตอบนี้ต้องการ upvotes เพิ่มเติม แก้ไขปัญหาสำหรับฉันใน 16.04 ขอบคุณ
kapad

ยินดี. ตอนนี้ฉันย้ายจาก 14.04 เป็น 16.04 ฉันกำลังค้นหาวิธีใหม่ของการทำสิ่งต่าง ๆ อย่างช้าๆเมื่อเวลาผ่านไป
68186

1
ใช้ได้กับ Ubuntu GNOME 16.04.1
HarlemSquirrel

4

ใน 12.04 ฉันสังเกตเห็นว่าเมื่อมีการเรียกใช้การจำศีล (โดยใช้PM_HIBERNATE_DELAY=XX) การดำเนินการต่อ / การละลายสคริปต์เชลล์ไม่ได้ตั้งค่าตัวแปร grub recordfail ดังนั้นด้วงจะไม่ทำการ Autoboot โดยอัตโนมัติ

การหมดเวลาถูกตั้งค่าเป็น -1 และรอการเลือกของผู้ใช้ /etc/pm/sleep.d/10_grub-commonฉันเดานี้ต้องแก้ไขบางอย่างของสคริปต์ใน ฉันเป็นสามเณรดังนั้นฉันจึงไม่ได้ขลุกอยู่กับการเปลี่ยนแปลงที่แน่นอนอย่างน่าเสียดาย


1
น่าจะเป็นรายงานข้อผิดพลาดและ / หรือการทดสอบที่คุ้มค่าหากใช้งานได้ใน 12.10+
blueyed

ฉันเห็นปัญหาเดียวกันใน 12.10
MDCore

3

คำถามนี้เกิดขึ้นบ่อยพอใน Google ที่ฉันคิดว่ามันคุ้มค่าที่จะชน วิธีการอธิบายที่นี่คือ (imo) ไม่ใช่การระงับแบบไฮบริด มันคือ "ไฮเบอร์เนตหลังจาก X นาทีถูกระงับ" True hybrid suspend เขียน RAM ของคุณไปยังดิสก์จากนั้นเข้าสู่สถานะพลังงานต่ำ (โหมดสลีป) ในขณะที่ใช้เวลานานขึ้นเรซูเม่จะเกิดขึ้นทันทีในขณะที่เครื่องเหลือแบตเตอรี่มิฉะนั้นจะดำเนินการต่อในรูปแบบฮาร์ดดิสก์ พฤติกรรมนี้เป็นสิ่งที่คนส่วนใหญ่รู้จักกันในชื่อไฮบริดสลีปและใช้เป็นค่าเริ่มต้นในแล็ปท็อป Windows และ Mac รุ่นใหม่กว่า

นี่คือวิธีการเปิดใช้งานการระงับไฮบริดจริง :

  • ทำตามส่วนแรกของคำตอบด้านบน แทนที่การ "หยุดชั่วคราว" การโทรนี้เพื่อทำการ "hybrid_suspend" ในช่วงบ่าย
    % cat /etc/pm/config.d/00-use-suspend-hybrid
    # ใช้ suspend_hybrid แทนการระงับ
    if ["$ METHOD" = "ระงับ"]; แล้วก็
        วิธี = suspend_hybrid
    Fi
  • ทำสำเนาสำรองของ / usr / lib / pm-utils / pm-functions
  • รับแพตช์จากที่นี่: https://bugs.freedesktop.org/attachment.cgi?id=68712
    • แพทช์นี้เปิดใช้งานการระงับแบบไฮบริดหากมี (เช่นในเมล็ด 3.6+)
  • ใช้อย่างใดอย่างหนึ่งโดยใช้ 'patch -p0' หรือผสานเองหากล้มเหลว

วิธีนี้ใช้ได้กับ Sony Vaio SVS ของฉัน

PS: สร้างแพตช์ใหม่ที่นี่ในกรณีที่ไฟล์ถูกลบในอนาคต:

diff --git a / pm / pm-functions.in b / pm / pm-functions.in
--- a / pm / pm-functions.in
+++ b / pm / pm-functions.in
@@ -316,8 +316,28 @@ ถ้า [-z "$ HIBERNATE_MODULE"] && \
    {
        [-n "$ {HIBERNATE_MODE}"] && \
        grep -qw "$ {HIBERNATE_MODE}" / sys / power / disk && \
+ HIBERNATE_MODE_SAVE = $ (cat / sys / power / disk) && \
+ HIBERNATE_MODE_SAVE = "$ {HIBERNATE_MODE_SAVE ## * [}" && \
+ HIBERNATE_MODE_SAVE = "$ {HIBERNATE_MODE_SAVE %%] *}" && \
        echo -n "$ {HIBERNATE_MODE}"> / sys / power / disk
        echo -n "disk"> / sys / power / state
+ RET = $?
+ echo -n "$ HIBERNATE_MODE_SAVE"> / sys / power / disk
+ ส่งคืน "$ RET"
+}
+ Fi
+
+ # สำหรับเมล็ดที่รองรับการระงับทั้งสองอย่าง (เช่นไฮบริดชั่วคราว)
+ # ตั้งแต่เคอร์เนล 3.6
+ ถ้า [-z "$ SUSPEND_HYBRID_MODULE"] && \
+ [-f / sys / พลังงาน / ดิสก์] && \
+ grep -q ดิสก์ / sys / power / state && \
+ grep -q suspend / sys / power / disk; แล้วก็
+ SUSPEND_HYBRID_MODULE = "เคอร์เนล"
+ do_suspend_hybrid ()
+ {
+ HIBERNATE_MODE = "ระงับ"
+ do_hibernate
    }
 Fi

แหล่งที่มา:


1
คุณพูดถูกเกี่ยวกับลูกผสม ฉันเพิ่งเปลี่ยนตัวอย่างของฉันเอง คุณสามารถรับ (ค่อนข้าง) ผลลัพธ์เดียวกันโดยใช้ METHOD = hibernate และ HIBERNATE_MODE = suspend ฉันกำลังตั้งค่า HIBERNATE_MODE = แพลตฟอร์มที่ด้านบนของไฟล์แทนที่จะบันทึกและกู้คืนเวอร์ชันก่อนหน้า (สิ่งที่แพตช์ทำ) ฉันจะอัปเดตคำตอบของฉันด้านบน
blueyed

ดูดีมากขอบคุณสำหรับการแก้ไข @blueyed
Rohan Dhruva

1

มีวิธีแก้ไขปัญหาอื่นโดยไม่ต้องเพิ่มไฟล์ใด ๆ ใน config.d เพียงแค่ใช้ Wakealarm ใน / sys / class / rtc / rtc0 ทำให้ใช้รหัสล้าสมัยในฟังก์ชั่น pm (/ usr / lib / pm-utils) หลังจากความคิดเห็น #since เคอร์เนลไม่สนับสนุนโดยตรง ... , ('เพราะเคอร์เนลปัจจุบัน (หลังจาก 3.6 บางสิ่งบางอย่าง) ไม่สนับสนุนโดยตรง) ย้อนกลับรหัสนั้นและใส่ในส่วน do_suspend () แทน do_suspend_hybrid () และใช้โปรแกรมแก้ไขสำหรับฟังก์ชั่นน. (จนกว่าพวกเขาจะแก้ไข)

รหัสล้าสมัย (หยุดชั่วคราวแล้วไฮเบอร์เนตเมื่อเรียกใช้ suspend_hybrid):

# 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

แนะนำ ใช้งาน uswsusp ได้ง่ายขึ้นในขณะเดียวกันก็เพิ่มประโยชน์สูงสุดของ s2both เช่น s2both เมื่อถูกระงับ วางโค้ดการย้อนกลับใน do_suspend () ส่วนหนึ่งของโมดูล uswsusp (/usr/lib/pm-utils/module.d)

เปลี่ยนรหัส (suspend_hybrid เมื่อเรียกว่า 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      

ด้วย uswsusp เราสามารถเห็นความคืบหน้าของการหยุดชั่วคราว / จำศีลและกระบวนการย้อนกลับที่แสดงในข้อความแม้เราสามารถยกเลิกได้โดยการกด backspace หากไม่มี uswsusp ให้ระงับ / จำศีลเพียงแค่ปรากฏขึ้น - หายไปอย่างน่ารำคาญโดยเฉพาะอย่างยิ่งเมื่อ Wakealarm ถูกเรียกใช้และดำเนินการจำศีล (s2disk ใน uswsusp) กำหนดช่วงเวลาของการนอนหลับก่อนที่จะจำศีลในสถานที่ปกติในไฟล์ฟังก์ชั่นน

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

นี่คือ mod ของ uswsusp: (จำไว้ว่าโมดูลนี้ถูกเรียกจากฟังก์ชั่น pm เพื่อให้ตัวแปรที่ใส่เข้าไปเหมือนกัน)

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

0

คำตอบโดย user68186 สำหรับ Ubuntu 16.04 ไม่ทำงานสำหรับฉัน อย่างไรก็ตามการแก้ปัญหาที่นี่ทำ

ขั้นแรกให้แน่ใจว่าการจำศีลทำงาน แล้วก็

ค้นหาและติดตั้ง dconf Editor ในซอฟต์แวร์ Ubuntu จากนั้นเปิดใช้และไปที่ org -> gnome -> settings daemon -> plugins -> power

เปลี่ยนค่าของ“ การปิดฝาปิดแอคชั่น” และ“ ปิดฝาปิดแบตเตอรี่แอคชั่น”

ในการตั้งค่าพลังงานของฉันตัวเลือกเหล่านี้จะแสดงเป็นค่าว่าง แต่ทำงานได้ตามที่ต้องการ


0

ในUbuntu 18.04นั้นง่ายขึ้น ในsystemdเป็น availiable โหมดใหม่Suspend-แล้วจำศีล ในการเริ่มใช้งานฟังก์ชั่นนี้คุณต้องสร้างไฟล์/etc/systemd/sleep.confด้วยเนื้อหาถัดไป:

[Sleep]
HibernateDelaySec=3600

จากนั้นคุณสามารถทดสอบโดยใช้คำสั่ง:

sudo systemctl suspend-then-hibernate

(คุณสามารถแก้ไข HibernateDelaySec เพื่อลดความล่าช้าในการจำศีล) หากทุกอย่างเรียบร้อยคุณสามารถเปลี่ยน Lid Close Action ได้คุณต้องแก้ไขไฟล์/etc/systemd/logind.conf

คุณต้องไปหาตัวเลือกHandleLidSwitch =มัน uncomment และการเปลี่ยนแปลงที่จะHandleLidSwitch = Suspend-แล้วจำศีล จากนั้นคุณต้องรีสตาร์ทบริการ logind (การใช้งาน! เซสชันผู้ใช้ของคุณจะถูกรีสตาร์ท) โดยคำสั่งถัดไป:

systemctl restart systemd-logind.service

นั่นคือทั้งหมด! ตอนนี้คุณสามารถใช้ฟังก์ชั่นที่ดีนี้ได้แล้ว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.