LINUX.ORG.RU

Засыпает сразу после просыпания


0

0

Требуется, чтобы ноутбук переходил в спящий режим (suspend to RAM) при закрытии крышки.

Это сделано отловом события через ACPI и pm-suspend:

# cat /etc/acpi/acpi_handler.sh
#!/bin/sh
# Default acpi script that takes an entry for all actions

IFS=${IFS}/
set $@

case "$1" in
  button)
    case "$2" in
      power) /sbin/init 0
         ;;
      lid)  /usr/sbin/pm-suspend --auto-quirks
         ;;
      *) logger "ACPI action $2 is not defined"
         ;;
    esac
    ;;
  *)
    logger "ACPI group $1 / action $2 is not defined"
    ;;
esac

Однако при таком засыпании нажатие на кнопку включения ноутбука приводит не только к его просыпаниюю, но и немедленному засыпанию снова; после повторного нажатия кнопки ноутбук просыпается полностью :-)

Не важно, что используется: эффект от echo mem > /sys/power/state такой же. Я удалаял все другие события (кнопку power) - ничего не изменилось. При усыплении из командной строки - всё нормально, просыпается на раз. Я делаю вывод, что acpid виновен в неправильной обработке «кнопки» lid.

что делать?

☆☆

убери все скрипты нах и посмотри на то, что выдает acpi_listen. Скорее всего, у тебя при закрытии крышки генерятся двойные события. Возможное решение -- что-то типа создания лок-файла, который через определенный промежуток времени удаляешь.

Была похожая ситуация, когда быстро открывал и закрывал крышку ноута -- тоже такой же цикл был.

fizteh
()
Ответ на: комментарий от fizteh

Точно!

Событие button/lid происходит два раза.
Я 4 раза нжал "power" (для проверки acpi_listen)
и один раз закрыл крышку.

button/power PWRF 00000080 00000001
button/power PWRF 00000080 00000002
button/power PWRF 00000080 00000003
button/power PWRF 00000080 00000004
button/lid LID 00000080 00000017
button/lid LID 00000080 00000018

ip1981 ☆☆
() автор топика
Ответ на: комментарий от ip1981

чтоб реагировал только на закрытие кусок из убунтовского скрипта:

grep -q closed /proc/acpi/button/lid/*/state if [ $? = 0 ] then # echo "LID action closed" > /dev/tty5 /usr/sbin/hibernate -F /etc/hibernate/sysfs-ram.conf fi [ -x /etc/acpi/local/lid.sh.post ] && /etc/acpi/local/lid.sh.post

mrZombie
()
Ответ на: комментарий от ip1981

[code]
#!/bin/bash

BUTTON=$(basename $1)
TIME_FILE=/var/log/acpi_time
DELTA_TIME=20 #задержка по времени между суспендами
IS_X="yes"
do_reload(){
        /etc/init.d/console-setup restart
        /etc/init.d/hotkeys.local restart >/dev/null
}
do_suspend_X(){
        ps -A | grep Xorg > /dev/null
        if [ "$?" == "0" ]
        then
                IS_X=yes
                chvt 1
        else
                IS_X=no
        fi
}
do_resume_X(){
        if [ $IS_X == yes ]
        then
                chvt 7
        fi
}
case $BUTTON in
        lid)
        logger "lid action, trying to hibernate"
        if [ -e $TIME_FILE ] ; then
                OLD_TIME=`cat "$TIME_FILE"`
                CUR_TIME=`date +%s`
                ((CUR_DELTA_TIME=$CUR_TIME-$OLD_TIME))
                if [ $CUR_DELTA_TIME -le $DELTA_TIME ]; then
                        #слишком часто надрачивается крышка
                        exit
                fi
        fi
        echo $CUR_TIME > "$TIME_FILE"
        do_suspend_X
        /etc/init.d/hotkeys.local stop
        [[ -f /sys/power/state ]] && echo mem > /sys/power/state
        reset
        do_resume_X
        do_reload
        ;;
        power)
            logger "power action, trying to suspend"
            do_suspend_X
            if [ -f /sys/power/tuxonice/do_hibernate ] ; then
                    echo 1 > /sys/power/tuxonice/do_hibernate
            elif [ -f /sbin/s2disk ] ; then
                    /sbin/s2disk
            elif [ -f /sys/power/state ] ; then
                    echo disk > /sys/power/state
            fi
            do_resume_X
            do_reload
            ;;
        *)
            logger "unhandled button: $BUTTON"
            ;;
esac
[/code]

так у меня, еще с гентушных времен

fizteh
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.