LINUX.ORG.RU

Как определить, что система находится в режиме сна или энергосбережения?

 , ,


2

3

Здравствуйте! Имеется микрокомпьютер Raspberry Pi с ОС RASPBIAN JESSIE (на основе Debian), графическая оболочка LXDE. По HDMI к нему подключен LCD дисплей. Подсветка дисплея программно не выключается, только выключателем на плате. Таким образом когда малинка входит в режим сна или энергосбережения подсветка продолжает работать, что не есть хорошо. Можно ли как-то определить, что система в данный момент находится в режиме сна или энергосбережения?

Решено!
Попутно еще один вопрос. Почему из cron не выполняются команды выключения дисплея, перехода в режим сна или ожидания:

xset dpms force [off] [stanby] [syspend]

Спасибо.

Почему из cron не выполняются команды выключения дисплея, перехода в режим сна или ожидания

Потому что крон не знает, с каким дисплеем работать. Попробуй:

DISPLAY=:0.0 /usr/bin/xset dmps force off

По первому вопросу не подскажу, но первое, что попадается в гугле — утилита tvservice, попробуй поковырять её.

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

Спасибо, получилось!
Точнее будет:

 DISPLAY=:0.0 /usr/bin/xset dpms force off
Юзаю tvservice

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

Тебе намекают, что если система спит, то никакие программы уже не работают. А вот чтобы отловить переход/выход в сон, можешь использовать systemd'шные target'ы.

Например, как-то так будет выглядеть сервис, выполняющийся перед переходом в сон:

[Unit]
Description=On suspend action
Before=sleep.target

[Service]
User=username
Type=normal
Environment=DISPLAY=:0
ExecStart=/path/to/your/script.sh

[Install]
WantedBy=sleep.target

Возможно придётся добавить что-нибудь вроде ExecStartPost=/usr/bin/sleep 1, если скрипт не будет успевать выполняться до перехода в сон.

Соответственно, для отслеживания выхода из сна, нужно заменить Before на After.

режим энергосбережения

Тут уже сложнее. Если речь идёт об отключении экрана, то первое, что приходит в голову — в скрипте периодически проверять вывод xset q. Например так:

while true
do
if xset q | grep -q "Monitor is On"
    then
        echo "On"
    else
        echo "Off"
    endif

    sleep 1
done

При необходимости можно запоминать состояние и обрабатывать только его изменение.

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

Извините, не понял. Можно подробнее.

Если система уснула s2ram / s2disk, то процессор ничего не выполняет.

andreyu ★★★★★ ()
Ответ на: комментарий от grazor

По первому вопросу не подскажу, но первое, что попадается в гугле — утилита tvservice, попробуй поковырять её.

tvservice здесь не подойдет: в моем случае подсветка не управляется по HDMI. Это отдельная цепь на плате дисплея, не интегрированная в общую схему. Но благодаря Вам решение найдено:
1. Отключить в RPi скринсейвер и переходы в режимы сна и энергосбережения.
2. По cron запускается команда отключения дисплея, см. выше.
3. Одновременно по cron запускается скрипт, который выдает сигнал выключения на один из выводов порта RPi. Этот вывод я подсоединю к схеме подсветки дисплея.
Получилось немного коряво, т.к. выключение не будет зависеть от времени неактивности пользователя, как было-бы при работе скринсейвера.

Осталось решить, как включить подсветку. Т.е., как программно отследить событие мыши/клавиатуры? Но думаю это решаемо.

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

Все решено!
Командой xset -q мониторить состояние «Monitor is On(Off)»
Про «режимы сна и энергосбережения» - каюсь, это я неверно сформулировал вопрос. Основная задача: отключать подсветку, когда выключен монитор. Всем спасибо!

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