LINUX.ORG.RU

Выполнение скрипта при включении экрана

 


0

1

Мне нужно, чтобы каждый раз при включении экрана ноутбука выполнялся некий скрипт. Возможно ли такое реализовать средствами systemd?

UPD. Опишу лучше суть проблемы: Использую этот хак, дабы сделать глазам комфортнее:

intel_reg_write 0xC8254 0x7a107a1
Но оно сбрасывается на стандартное значение при выключении экрана. А еще мне приходится мириться с тем, что ноут принудительно уходит в сон каждые пол часа. Я то повесил на хоткей, но частенько забываю, а вспоминаю, когда начинают болеть глаза.

UPD2. Проблема решена правилом для udev:

cat /etc/udev/rules.d/61-drm-eyes-thnk.rules
KERNELS=="card0-LVDS-1", SUBSYSTEMS=="drm", ATTRS{enabled}=="enabled", RUN+="/usr/bin/intel_reg_write 0xC8254 0x7a107a1"

★★★★★

Последнее исправление: Medar (всего исправлений: 2)

Что понимается под «включением экрана»? Экран потушился — ты подвинул мышь — DE зажгло экран снова?

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

Экран потушился — ты подвинул мышь — DE зажгло экран снова?

Это тоже. Или при выходе из сна, или я принудительно ему сделал xset dpms force off.

Medar ★★★★★
() автор топика
Ответ на: комментарий от intelfx

Тогда нет, это событие поймать нельзя

Жаль. Может есть какое-то костыльное решение? Где-то же можно узнать состояние экрана.

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

Хз. Состояние-то узнать наверняка можно (хотя я не знаю, как) — но ты собираешься опрашивать каждую секунду и ловить положительный фронт? :]

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

но ты собираешься опрашивать каждую секунду и ловить положительный фронт? :]

Как вариант)
Опишу лучше суть проблемы: Использую этот хак, дабы сделать глазам комфортнее:

intel_reg_write 0xC8254 0x7a107a1
Но оно сбрасывается на стандартное значение при выключении экрана. А еще мне приходится мириться с тем, что ноут принудительно уходит в сон каждые пол часа. Я то повесил на хоткей, но частенько забываю, а вспоминаю, когда начинают болеть глаза.

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

Как насчёт делать каждую секунду intel_reg_read и в случае различий intel_reg_write? Можно даже каждые полсекунды, наверное.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 2)
Ответ на: комментарий от Medar

Ещё можно поллить вот этот файл: /sys/class/drm/card0-LVDS-1/dpms (насчёт card0-LVDS-1 не уверен, посмотри, как оно называется в твоей системе).

Но тут вопрос — этот твой параметр подсветочный сбрасывается именно при отключении дисплея (DPMS standby/off) или при переводе подсветки в ноль тоже? Если последнее, то ещё нужно поллить /sys/class/backlight/intel_backlight/brightness, но тут я не уверен, каким методом у тебя управляется подсветка (нативным intel_backlight или ACPI'шным, например, acpi_video0) и синхронизируются ли они между собой.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 2)
Ответ на: комментарий от Medar

Хз как с SystemDick, но у меня в Gentoo c OpenRC и pm-utils вот такой скрипт лежит с правами 755 в /etc/pm/sleep.d/99-local-service.sh:

#!/bin/sh
# Stop local service before sleep, start it after

. "${PM_FUNCTIONS}"

case "$1" in
    hibernate|suspend)
        [ -x /etc/init.d/local ] && /etc/init.d/local stop
        ;;
    resume|thaw)
        [ -x /etc/init.d/local ] && /etc/init.d/local start
        ;;
esac

А уже в скриптах для local сервиса (/etc/local.d/) делается что нужно. Можно напрямую в том скрипте выше дёргать что надо.

Линки с доп. инфой по pm-utils:
http://www.gentoo-wiki.info/Pm-utils
https://wiki.archlinux.org/index.php/Pm-utils_(Русский)

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

UPD: Это для того, чтобы делать что-то при просыпании. А при действия при включении экрана - это к acpid. Я сам такие действия не настраивал, так что прийдётся тебе самому почитать тут:

https://wiki.gentoo.org/wiki/ACPI
https://wiki.archlinux.org/index.php/Acpid

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

Как насчёт делать каждую секунду intel_reg_read и в случае различий intel_reg_write?

Я вот тоже об этом подумал. Наверное так и сделаю.

Но тут вопрос — этот твой параметр подсветочный сбрасывается именно при отключении дисплея (DPMS standby/off) или при переводе подсветки в ноль тоже?

Нет, если подсветка в ноль, то не сбрасывается. Тем более на последних ядрах подсветка в ноль не такой уж и ноль.

нативным intel_backlight или ACPI'шным, например, acpi_video0

intel_backlight

Medar ★★★★★
() автор топика

С другой стороны, я тут заметил, что на моей системе dpms force off вызывает изменение уровня подсветки, а при (любом) изменении последнего генерится udev-событие.

Проверь:

udevadm monitor

и пощёлкай подсветкой/дисплеем. Если при каждом действии, которое нужно ловить, появляются строчки вида

UDEV [108360.360646] change /devices/pci0000:00/0000:00:02.0/drm/card0/card0-eDP-1/intel_backlight (backlight)

-- то зарепорть; можно будет сделать без поллинга.

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

Значит, можно поллить только /sys/class/drm/card0-LVDS-1/dpms. Если с udev не прокатит.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)

Костыль:

В /etc/pam.d/gdm-password (если GDM, для других DM принцип тот же) подсунь скрипт через pam_exec. Скрипт будет выполняться каждый раз, когда ты разблокируешь экран :)

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

Ну так настроить чтобы блокировка была одновременно с выключением экрана.

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

Спасибо, но хочется, чтобы все скопом делалось. Тем более systemd это легко делает.

acpid

Я тоже на него надеялся, но хз, как поймать включение экрана, acpi_listen молчит.

Medar ★★★★★
() автор топика
Ответ на: комментарий от Black_Roland

Не использую такие блокировщики, да и у меня awesome.

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

Отлично. Чтобы ловить фронты, можно по отрицательному значению запускать некий oneshot-сервис (через systemctl start --no-block, а не через SYSTEMD_WANTS), а по положительному значению — его останавливать. В самом сервисе директиву ExecStart= опустить, а ExecStop= — указать (и ещё выставить RemainAfterExit=yes).

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 3)
Ответ на: комментарий от intelfx

Обошелся udev-ом:

cat /etc/udev/rules.d/61-drm-eyes-thnk.rules
KERNELS=="card0-LVDS-1", SUBSYSTEMS=="drm", ATTRS{enabled}=="enabled", RUN+="/usr/bin/intel_reg_write 0xC8254 0x7a107a1"

Medar ★★★★★
() автор топика
Ответ на: комментарий от intelfx
cat /sys/class/drm/card0-LVDS-1/dpms
cat: /sys/class/drm/card0-LVDS-1/dpms: No such file or directory

как то так

 ls /sys/class/drm/
card0@  card0-DVI-I-1@  card0-DVI-I-2@  card0-TV-1@  controlD64@ 
у меня по другому. Приведенная же мной строчка из скрипта который не менялся с 2009 года, и побывал на многих машинах с разной конфигурацией и ОС. Хотя на вкус и цвет как говорится.

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

Значит, замени LVDS-1 на название нужного видеовыхода.

Приведенная же мной строчка из скрипта который не менялся с 2009 года

Да пожалуйста. Просто приведённая тобой строчка — это переусложнённая скриптота, которую можно заменить чтением из одного файла. К тому же она не работает на многомониторных конфигурациях.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 2)
Ответ на: комментарий от intelfx

Согласен что это лишние сущности.

У меня сейчас два монитора и она прекрасно работает. Ладно, я же не навязываю её. Но на заметку про /sys/class/drm взял.

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

У меня сейчас два монитора и она прекрасно работает.

Видимо, не везде.. У меня тоже (один из них off, второй on) и оно пишет, что DPMS is not supported.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

Кстати, спрошу еще.
У меня есть такой таймер:

[Unit]
Description=Suspend each 25 minutes

[Timer]
OnBootSec=25min
OnUnitActiveSec=25min

[Install]
WantedBy=timers.target
Как бы так сделать, чтобы таймер сбрасывался, когда я в сон принудительно ноут отправляю?

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

Думаю, стоит заменить оба триггера на один — OnActiveSec=25min и перезапускать таймерный юнит при уходе в саспенд. Делается это так:

[Unit]
Description=Re-arm suspend timer
StopWhenUnneeded=true
Requisite=<имя-таймера> # ничего не делать (сфейлиться), если таймер не запущен

[Service]
Type=oneshot
ExecStart=/bin/systemctl stop <имя-таймера>
ExecStop=/bin/systemctl start <имя-таймера>
RemainAfterExit=true

[Install]
WantedBy=sleep.target

sleep.target запускается строго до ухода в саспенд/гибернацию/whatever и останавливается строго после выхода из них.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 2)
Ответ на: комментарий от intelfx

Если нужен только саспенд — то

[Unit]
Description=Re-arm suspend timer
StopWhenUnneeded=true
Requisite=<имя-таймера> # ничего не делать (сфейлиться), если таймер не запущен
Before=systemd-suspend.service

[Service]
Type=oneshot
ExecStart=/bin/systemctl stop <имя-таймера>
ExecStop=/bin/systemctl start <имя-таймера>
RemainAfterExit=true

[Install]
WantedBy=suspend.target
intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

Вроде работает, спасибо.

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