Suspend에서 Hibernate로 자동 이동하는 방법?


53

"Suspend Sedation"인 Suspend에서 Ubuntu를 최대 절전 모드로 전환 할 수 있습니까?

내가 찾고있는 것은 이것입니다 :
뚜껑을 닫으면 노트북이 일시 중단됩니다. 그런 다음, 여전히 배터리를 사용하지 않으면 미리 정해진 시간이 지나면 (배터리가 강한 경우에도) 배터리 전원을 절약하기 위해 최대 절전 모드로 전환해야합니다.

예를 들어, 뚜껑을 닫으면 노트북이 일시 중단 상태가되도록 설정되어 있습니다. 그렇다면 하루 종일 사용하지 않으면 배터리가 고갈됩니다. 일시 중단 모드에서도 하드웨어는 여전히 소량의 전력을 소비하고 결국 배터리는 방전되기 때문입니다. 내가 원하는 것은 Ubuntu에 일시 중단 된 경우에도 몇 시간 동안 활동이 없으면 여전히 최대 절전 모드로 전환해야한다는 것을 알리는 것입니다.

Windows가 그렇게 할 수 있습니다. Ubuntu는 타이머에서 대기 또는 최대 절전 모드 로 전환하도록 프로그래밍 할 수 있지만 둘다는 아닙니다.


내 연구에서 나는 동일한 Linux Mint 스레드를 찾았지만 "Suspend Sedation"은 해당 기능에 대한 공식 Microsoft 용어가 아니며 Linux Mint 포럼 사용자가 말할 수있는 한 그것을 언급했습니다.
ayan4m1

그 기능에 대한 더 나은 이름이 있습니까?
Sergey Stadnik 11:11

내가 알 수있는 한, 기능에 보편적으로 허용되는 이름은 없습니다. "Hybrid suspend"는 일부 사람들에 의해 사용되며 "suspend sedation"은 한 Linux Mint 포럼 사용자가 사용하며 이전에 프로세스를 참조하는 데 사용되는 "hibernate and suspend"를 들었습니다. Microsoft는 공식적으로 Windows 7의 경우 "하이브리드 슬립"이라고합니다.
ayan4m1

2
@ ayan4m1 나는 이것이 오래된 질문이라는 것을 알고 있지만 이것을 명확히하는 것이 중요하다고 생각합니다. Hyrbid 수면은 "지정된 시간 후에 절전 모드를 해제하고 최대 절전 모드로 전환"과 다릅니다. 배터리가 소진되어 전원이 꺼지면 하이브리드 절전 모드가 최대 절전 모드로 전환됩니다. OP에 설명 된 동작은 하이브리드 절전 모드를 활성화하지 않아도됩니다.
Paul

답변:


20

에서 우분투 18.04 훨씬 더 쉽다. 에서 systemd 새로운 모드를 사용할 일시 중지 후 - 최대 절전 모드 . 이 기능을 사용하려면 다음 내용으로 /etc/systemd/sleep.conf 파일 을 만들어야 합니다 .

[Sleep]
HibernateDelaySec=3600

그런 다음 명령으로 테스트 할 수 있습니다.

sudo systemctl suspend-then-hibernate

HibernateDelaySec최대 절전 모드의 지연을 줄 이도록 편집 할 수 있습니다 .


모든 것이 제대로 작동하면 덮개 닫기 조치를 변경할 수 있습니다.이를 수행하려면 /etc/systemd/logind.conf 파일을 편집해야 합니다.

옵션을 찾아서 HandleLidSwitch=주석 처리를 제거하고로 변경해야 HandleLidSwitch=suspend-then-hibernate합니다. 다음 명령으로 systemd-logind 서비스를 다시 시작해야합니다 (경고! 사용자 세션이 다시 시작됨).

sudo systemctl restart systemd-logind.service

그게 다야! 이제이 멋진 기능을 사용할 수 있습니다.


이것은 자리에 있었다. Pop! _OS 18.10 (일명 우분투 18.10)에서 사용합니다.
eduncan911

화려한 감사합니다! sleep.conf가 어떤 식 으로든 최대 절전 모드에 영향을 줍니까, 아니면 최대 절전 모드에만 영향을 줍니까?
user2428107


35

이에 대한 해결책은 간단합니다. 먼저, 일시 중단 및 재개시 pm-suspend 프로그램은 /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 시간입니다. 최대 절전 모드 기능을 실행하는 동안 랩톱은 해당 시간에 몇 초 동안 작동합니다.

따라서 랩톱을 케이스에 넣을 계획이라면 일시 중단하지 말고 대신 최대 절전 모드로 전환하십시오. 그렇지 않으면 랩탑이 esp에서 과열 될 수 있습니다. 꽉 끼는 슬립 케이스에있는 경우 (몇 초에서 1 분 동안 만 켜져 있음).

나는 지난 며칠 동안이 방법을 사용 해 왔으며 지금까지 성공적이었습니다 (오늘 오후에 방전 된 배터리에서 나를 구했습니다). 즐겨.

systemd최신 Ubuntu 버전 을 사용하는 다른 Linux 배포판의 경우 스크립트 /usr/lib/systemd/system-sleep대신에 스크립트를 배치하면 여전히 작동합니다 /etc/pm/sleep.d. 또한 /usr/sbin/pm-hibernate명령을로 바꾸십시오 systemctl hibernate.


여기에서 효과가 있었지만 파일을 chmod하여 모든 사람에게 X를 추가 한 후에 만 ​​가능합니다. 나는 거대한 초보자이며 알아내는 데 2 ​​일이 걸렸습니다. 아주 좋은 대본이며 이것이 문제가있는 사람에게 도움이되기를 바랍니다. 감사합니다.

2
이것은 유용한 Ubuntu / Debian 패키지를 만들 것입니다!
Petr Pudlák

궁금한 점 : 우분투 13.04에서도 여전히 유효합니까? 정확히이 솔루션이 필요하지만 최신 버전에서 문제가 발생하면 아내의 노트북을 엉망으로 만들고 싶지 않습니다.
Torben Gundtofte-Bruun

스크립트 주셔서 감사합니다. 우분투 14.04에서 잘 작동합니다! 랩톱이 최대 절전 모드로 전환 될 때 AC 전원에 연결되어 있는지 확인할 수 있습니다. 그렇다면 최대 절전 모드 대신 다시 일시 중단하고 싶습니다. 최대 절전 모드에서 복원하는 데 시간이 오래 걸리고 전원이 연결되어있을 때 최대 절전 모드를 수행 할 필요가 없습니다.
maddentim

정말 고맙습니다!!!! 이 대본은 내가 꿈꿔 왔던 마술이다 !!
yanpas

12

작동 방식을 설명하려면 (이것은 Windows와 유사 함) 배터리가 부족할 때 시스템이 스왑 파티션에 머신 상태를 저장할 수있을 때 머신이 대기 모드에서 깨어나지 않으며, 스왑 파티션에 모든 것을 즉시 저장합니다 대기 모드에서 배터리가 소진되면 스왑 파티션에서 상태를로드하여 (최대 절전 모드에서와 같이) 배터리를 복구합니다.

AFAIK 리눅스는 하드웨어에서 작동하는 것을 알고 있다면 "일반"대기 대신 하이브리드 대기 / 최대 절전 모드를 사용해야합니다. 너무 많은 버그 또는 무언가 때문에 현재 비활성화되어있을 수도 있습니다 ...;)

실험을 좋아한다면 pm-suspend-hybrid으로 좋은 결과를 얻을 수 있는지 확인할 수 있습니다 .

다음이 운이 좋다고 말하는 경우 이론적으로 하이브리드 일시 중단이 시스템에서 지원됩니다.

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

1
쉘 명령의 단일 아포스트로피가 오도되어 혼동 될 수 있습니다. 피하십시오.
ayan4m1

1
Bah, 다른 텍스트에 포함 된 명령 줄을 명령 줄로 생각하지 않고 편집 할 때 발생하는 현상입니다. 감사 및 수정.
JanC November

문제 없습니다. 두 프로세스의 서로 다른 헤드 스페이스에 대해 이해했습니다.
ayan4m1

6

s2both에 관심이있을 수 있습니다 . uswsusp우분투 10.10 패키지 로 제공됩니다 . 디스크를 일시 중단하지만 대신 시스템을 종료하는 대신 우분투의 "일시 중지"옵션과 관련된 전원 모드 인 S3로 전환합니다. pm-suspend-hybrid 는 동일한 작업을 수행하는 또 다른 도구입니다.

뚜껑을 닫을 때이를 자동화하려면 뚜껑 이벤트가 발생했을 때 임의의 스크립트를 실행할 수있는 다음 안내서를 살펴보십시오.

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

ThinkPad를 사용하는 경우에 대한 맨 페이지 tpctl에서 인수를 참조하면 --pm-sedation-hibernate-from-suspend-timer원하는 기능을 제공하는 것 같습니다. ThinkPad 이외의 하드웨어에서 이것을 시도하지 않도록주의 할 것입니다.

참고로, hibernate.conf에 대한 맨 페이지를 살펴 보았습니다 . 관련 옵션이없는 것 같지만 두 번째 읽을 가치가 있습니다.


5

우분투 16.04-미리 결정된 시간이 지난 후 일시 중단 / 절전 모드에서 최대 절전 모드로 전환

우분투 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다음 내용으로 파일 을 작성하십시오 .

[단위]
Description = 지연된 최대 절전 모드 트리거
Before = suspend.target
충돌 = 최대 절전 모드 대상 하이브리드 일시 중단 대상
StopWhenUnneeded = true

[서비스]
타입 = 원샷
RemainAfterExit = 예
ExecStart = / usr / local / bin / delayed-hibernation.sh prespend
ExecStop = / usr / local / bin / delayed-hibernation.sh 게시 일시 중단

[설치]
WantedBy = sleep.target
  1. /etc/delayed-hibernation.conf다음 내용으로 스크립트 의 구성 파일 을 작성하십시오 .
# 'delayed-hibernation.sh'스크립트의 구성 파일

# 컴퓨터가 최대 절전 모드로 전환되기 전에 절전 모드에서 사용할 시간을 초 단위로 지정하십시오
TIMEOUT = 1200 # 초, 20 분 제공
  1. 실제로 어려운 작업을 수행 할 스크립트를 작성하십시오.

    /usr/local/bin/delayed-hibernation.sh내용으로 파일 을 작성하십시오 .

#! / bin / bash
# 스크립트 이름 : delayed-hibernation.sh
# 목적 : 수면 후 자동 최대 절전 모드
#`hibernation_conf` 파일에서`TIMEOUT` 변수를 편집하여 잠자기 시간 (초)을 설정하십시오.

hibernation_lock = '/ var / run / delayed-hibernation.lock'
hibernation_fail = '/ var / run / delayed-hibernation.fail'
hibernation_conf = '/ etc / delayed-hibernation.conf'

# 설정 파일 확인
만약 [ ! -f $ hibernation_conf]; 그때
    echo "설정 파일 ( '$ hibernation_conf')이 누락되었습니다."
    1 번 출구
fi
hibernation_timeout = $ (grep "^ [^ #]"$ hibernation_conf | grep "TIMEOUT ="| awk -F '=' '{print $ 2}'| awk -F '#' '{print $ 1}'| tr -d '[[\ t]]')
[ "$ hibernation_timeout"= ""] 인 경우; 그때
    echo "구성 파일 ( '$ hibernation_conf')에서 'TIMEOUT'매개 변수가 누락되었습니다."
    1 번 출구
elif [[! "$ hibernation_timeout"= ~ ^ [0-9] + $]]; 그때
    echo "구성 파일 ( '$ hibernation_conf')의 잘못된 'TIMEOUT'매개 변수 ( '$ hibernation_timeout'), 예상 시간 (초)이 중단되었습니다."
    1 번 출구
fi

# 주어진 매개 변수 처리
[ "$ 2"= "일시 중단"]이면; 그때
    curtime = $ (날짜 + % s)
    [ "$ 1"= "pre"] 인 경우; 그때
        만약 [-f $ hibernation_fail]; 그때
            echo "실패한 최대 절전 모드가 감지되어 RTC 웨이크 업 타이머 설정을 건너 뛰었습니다."
        그밖에
            echo "일시 정지 감지. 녹화 시간, RTC 타이머 설정"
            에코 "$ curtime"> $ hibernation_lock
            rtcwake -m no -s $ hibernation_timeout
        fi
    elif [ "$ 1"= "post"]; 그때
        만약 [-f $ hibernation_fail]; 그때
            rm $ hibernation_fail
        fi
        만약 [-f $ hibernation_lock]; 그때
            sustime = $ (고양이 $ hibernation_lock)
            rm $ hibernation_lock
            if [$ (($ curtime-$ sustime)) -ge $ hibernation_timeout]; 그때
                echo "일시 중단에서 자동 재개가 감지되었습니다. 최대 절전 모드 ..."
                systemctl 최대 절전 모드
                만약 [$? -ne 0]; 그때
                    echo "자동 최대 절전 모드가 실패했습니다. 대신 일시 중지하려고합니다."
                    $ hibernation_fail을 터치하십시오.
                    systemctl 일시 중단
                    만약 [$? -ne 0]; 그때
                        echo "자동 최대 절전 모드 및 일시 중단 장애 조치에 실패했습니다. 다른 작업이 없습니다."
                    fi
                fi
            그밖에
                echo "일시 중지 된 수동 재개 감지. RTC 타이머 지우기"
                rtcwake -m 비활성화
            fi
        그밖에
            echo "파일 '$ hibernation_lock'을 찾을 수 없습니다."
        fi
    그밖에
        echo "인식 할 수없는 첫 번째 매개 변수 : '$ 1', 'pre'또는 'post'로 예상
    fi
그밖에
    echo "이 스크립트는 systemctl delayed-hibernation.service에 의해 실행되도록되어 있습니다 (예상되는 두 번째 매개 변수 : 'suspend')"
fi
  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 상태 지연 최대 절전 모드 서비스

또는 서비스 사용에 대한 전체 로그 :

sudo journalctl -u 지연 최대 절전 모드 서비스

실행중인 서비스에서 얻는 일반적인 로그는 다음과 같습니다.

mile @ mile-ThinkPad : ~ $ sudo systemctl 상태 지연 최대 절전 모드 서비스 
● 최대 절전 모드 서비스-최대 절전 모드 트리거
   로드 됨 :로드 됨 (/etc/systemd/system/delayed-hibernation.service; 활성화; 공급 업체 사전 설정 : 활성화)
   활성 : 비활성 (죽음)

Jun 09 20:35:42 mile-ThinkPad systemd [1] : 지연 최대 절전 모드 트리거 시작 중 ...
Jun 09 20:35:42 mile-ThinkPad delayed-hibernation.sh [2933] : 일시 중단이 감지되었습니다. 녹화 시간, RTC 타이머 설정
Jun 09 20:35:42 마일 -ThinkPad 지연 hibernation.sh [2933] : rtcwake : RTC가 UTC를 사용한다고 가정 ...
6 월 9 일 20:35:42 마일 -ThinkPad 지연 -hibernation.sh [2933] : rtcwake : 2016 년 6 월 9 일 (목) 18:55:43에 / dev / rtc0를 사용하여 웨이크 업
Jun 09 20:55:44 mile-ThinkPad systemd [1] : 지연된 최대 절전 모드 트리거를 시작했습니다.
Jun 09 20:55:44 mile-ThinkPad systemd [1] : 지연 최대 절전 모드 서비스 : 더 이상 장치가 필요하지 않습니다. 멎는.
Jun 09 20:55:44 mile-ThinkPad systemd [1] : 지연된 최대 절전 모드 트리거 중지 중 ...
Jun 09 20:55:44 mile-ThinkPad delayed-hibernation.sh [3093] : 일시 중단에서 자동 이력서가 감지되었습니다. 최대 절전 모드 ...
Jun 09 20:55:44 mile-ThinkPad systemd [1] : 지연된 최대 절전 모드 트리거가 중지되었습니다.
mile @ mile-ThinkPad : ~ $ 

따라서 이것이 유용한 기능이 작동하도록 구성과 스크립트 버전의 올바른 조합을 알아 내려고 며칠을 보낸 이후 누군가에게 실제로 도움이되기를 바랍니다.


답변 주셔서 감사합니다, 이것은 여전히 ​​우분투 18.04의 매력처럼 작동합니다. 위의 답변을 얻을 수 없었습니다 /bin/systemctl hibernate. 명령 행에서 제대로 작동하더라도 systemd 스크립트에서 실행할 때 실행 은 항상 1을 반환합니다.
eugenhu

4

pm-hibernate컴퓨터에 문제가 생길 경우를 대비 하여 컴퓨터를 작동시키는 것보다 일시 중지하십시오. 따라서 다음을 사용할 수 있습니다.

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

3

여기에 업데이트 된 버전의 데릭 Pressnall의 대답 systemd와 함께 작동 및 포함 엘리야 케이건의 제안 , 그냥 드롭 /usr/lib/systemd/system-sleep/delayed_hibernation.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 정도는 스크립트가 계속 실행 되어도 최대 절전 모드를 방지합니다.
Sean

@Sean 이 스레드 에서 해결 방법을 시도 했습니까?
Niccolò Maggioni

올바른 방향으로 나를 가리켜 주셔서 감사합니다. 위의 스크립트를 참조한 시스템 서비스 (/etc/systemd/system/delayed-hibernation.service)를 만든 다음 /etc/systemd/system/suspend.target을 수정하여 delayed-hibernation.service가 필요합니다.
Sean

2

여기 내 요리법이 있습니다 (Ubuntu 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

그런 다음 시스템 대상을 만듭니다. # 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. 하지만 시스템 전체에 적용되므로 스크립트에 symlink를 추가했습니다.# ln -s /suspend.sh /etc/pm/sleep.d/0000rtchibernate


1

hybrid-sleepMac OS처럼 다른 일반적인 해결 방법도 있습니다 . 컴퓨터가 최대 절전 모드를 지원하는 경우이 기능을 사용할 수 있습니다.

systemctl hybrid-sleep

이 명령은 컴퓨터를 일시 중단하고 디스크로 보내야합니다 (최대 절전 모드). 일정 시간이 지나면 컴퓨터가 꺼집니다 (켜기면 최대 절전 모드 파일을 사용하여 깨어납니다).

추신 : 나는 그것이 OP가 게시 한 것이 아니라는 것을 알고 있지만 상당히 가깝습니다.


0

해당 파일을 chmod + x하는 것을 잊지 말고 실행 파일로 만드십시오.

/ sys / class / rtc / rtc0에 wakealarm을 사용하는 rtcwake가없는 또 다른 솔루션이 있습니다. # 커널이 직접 지원하지 않기 때문에 pm-functions (/ usr / lib / pm-utils)에서 더 이상 사용되지 않는 코드를 사용하십시오. 해당 코드를 되돌리고 do_suspend_hybrid () 대신 do_suspend () 부분에 넣습니다.

사용되지 않는 코드 (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의 이점을 극대화합니다. 되 돌린 코드를 uswsusp 모듈 (/usr/lib/pm-utils/module.d)의 do_suspend () 부분에 넣습니다.

복귀 된 코드 (suspend가 호출 될 때 suspend_hybrid) :

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를 사용하면 suspend / hibernate의 진행 상황과 텍스트로 표시된 역 과정을 볼 수 있습니다. 심지어 백 스페이스를 눌러 중단 할 수도 있습니다. uswsusp가 없으면, 특히 wakealarm이 트리거되고 최대 절전 모드 (uswsusp의 s2disk)가 실행되는 경우 일시 중지 / 최대 절전 모드가 성가신 것처럼 사라집니다. pm-functions 파일의 일반적인 위치에서 최대 절전 모드를 시작하기 전에 절전 모드를 설정하십시오.

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

다음은 uswsusp mod입니다. (이 모듈은 pm-functions에서 호출되므로 삽입 된 변수는 동일합니다)

#!/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  
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.