Если вы сталкивались с ситуацией, когда нажатие кнопки питания монитора приводит к неожиданным сбоям X11, а ручное отключение через xset dpms force off работает лишь частично – эта инструкция для вас. Разберём, как создать удобный скрипт, который не только переводит экран в энергосберегающий режим, но и предотвращает повторное затемнение после пробуждения.
Шаг 1: Создание скрипта для отслеживания нажатий клавиш
Основная задача – заставить систему ждать вашего действия перед восстановлением стандартных настроек энергосбережения. Для этого понадобится утилита xinput, которая отслеживает события ввода. Убедитесь, что она установлена:
sudo pacman -S xorg-xinput
Создайте файл await.sh в папке `~/bin` (если её нет – создайте через mkdir -p ~/bin). Вот содержимое скрипта:
#!/usr/bin/env bash
xinput test-xi2 --root 2>&1 |
grep --line-buffered -m 1 'EVENT type 2 (KeyPress)' &> /dev/null
Что здесь происходит:
– xinput test-xi2 –root отслеживает события ввода в реальном времени (включая нажатия клавиш);
– grep –line-buffered ищет первое совпадение с типом события KeyPress (нажатие клавиши);
– Флаг -m 1 останавливает выполнение после первого найденного события.
Важно: Не забудьте дать скрипту права на выполнение:
chmod +x ~/bin/await.sh
Шаг 2: Настройка алиаса и тонкости работы с xset
Теперь объединим всё в один алиас. Добавьте в ваш .bashrc или .zshrc строку:
alias off='xset dpms force off && await.sh && xset -dpms'
Разберём команду по частям:
- xset dpms force off – мгновенно выключает монитор;
- await.sh – ждёт любого нажатия клавиши;
- xset -dpms – отключает таймеры энергосбережения (именно они вызывают повторное затемнение).
Кстати, если после пробуждения экран всё равно гаснет, проверьте настройки хранителя экрана отдельно:
xset s off # Отключение screen blanking
xset s noblank # Запрет затемнения
Почему не сработает «xset dpms force off; xset -dpms» без await.sh? Потому что вторая команда выполнится сразу после первой, и настройки энергосбережения отключатся до пробуждения монитора. Нам же нужно деактивировать их именно после вашего возвращения к работе.
Распространённые ошибки и альтернативные методы
Проблема: Скрипт зависает или не реагирует на нажатия.
- Убедитесь, что в системе нет других процессов, блокирующих ввод (например, некоторые менеджеры окон могут перехватывать события).
- Проверьте, что xinput установлен и доступен в PATH.
Альтернатива: Если скрипт кажется сложным, можно использовать read с таймаутом, но это менее надёжно:
alias off='xset dpms force off && read -n 1 && xset -dpms'
Однако такой подход требует явного нажатия Enter, что не всегда удобно.
Дополнительная настройка для автоматизации
Чтобы избежать ручного ввода команд при каждом запуске системы, добавьте следующие строки в файл ~/.xprofile:
xset s off
xset -dpms
Это отключит энергосбережение глобально. Но будьте осторожны: на ноутбуках это может привести к ускоренному разряду батареи (решение лучше подходит для стационарных ПК).
На заметку: Если вы используете менеджер входа вроде LightDM, проверьте его конфигурацию в /etc/lightdm/lightdm.conf. Иногда параметры DPMS переопределяются на уровне демона.
Теперь, когда вы знаете как работает связка xset и xinput, можно экспериментировать: например, добавить звуковое уведомление при выключении монитора или привязать скрипт к сочетанию клавиш через i3wm или Openbox. Главное – не бойтесь менять параметры и проверять их влияние через xset q (эта команда покажет текущее состояние всех таймеров).