Как выключить монитор горячей клавишей в Ubuntu
К чему это и зачем
Традиционная команда для выключения монитора — xset dpms force off — в некоторых версиях Ubuntu неожиданно «просыпает» экран спустя ~1 минуту из‑за взаимодействия с системными вызовами. Простая автоматизация через Python + Xlib позволяет корректно отловить следующее событие ввода и предотвратить немотивированное пробуждение.
Коротко: этот метод полезен, если вы хотите быстро выключать экран ноутбука или внешнего монитора, экономя батарею, без смены спящего режима всей системы.
Поддерживаемые окружения и ограничения
- Работает в сессиях X11 (Xorg). Не будет работать в Wayland — у Wayland другие API для управления вводом и DPMS.
- Скрипт использует python и python-xlib; в некоторых системах требуется Python 2. Для Python 3 потребуются незначительные правки (см. раздел «Совместимость с Python 3»).
Быстрая инструкция — шаги
- Установите зависимости: sudo apt-get install python python-xlib
- Создайте исполняемый Python-скрипт с кодом ниже и сохраните, например, в ~/bin/screen_off.py
- Сделайте файл исполняемым (свойства файла → разрешить выполнение или chmod +x)
- Назначьте файл на горячую клавишу в настройках «Клавиатура → Сочетания клавиш»
Установка зависимостей
Откройте терминал и выполните:
sudo apt-get install python python-xlib
Эта команда установит интерпретатор Python (если он ещё не установлен) и библиотеку python-xlib, позволяющую работать с сервером X из Python.
Скрипт — создайте файл и вставьте код
Скопируйте и вставьте следующий код в текстовый редактор и сохраните как ~/bin/screen_off.py (или любое другое место):
#!/usr/bin/python
import time
import subprocess
from Xlib import X
from Xlib.display import Display
# Подключаемся к монитору X-сессии
display = Display(':0')
root = display.screen().root
# Блокируем указатель и клавиатуру, чтобы гарантировать получение следующего события ввода
root.grab_pointer(True,
X.ButtonPressMask | X.ButtonReleaseMask | X.PointerMotionMask,
X.GrabModeAsync, X.GrabModeAsync,
0, 0, X.CurrentTime)
root.grab_keyboard(True, X.GrabModeAsync, X.GrabModeAsync, X.CurrentTime)
# Выключаем монитор через xset
subprocess.call('xset dpms force off'.split())
# Запускаем команду для интеграции с gnome-screensaver (опционально)
p = subprocess.Popen('gnome-screensaver-command -i'.split())
# Небольшая пауза, чтобы система успела перейти в состояние «экран выключен»
time.sleep(1)
# Ждём следующего события ввода и затем завершаем процесс блокировки
while True:
print(display.next_event())
p.terminate()
breakПримечание: shebang указывает /usr/bin/python — в некоторых системах это Python 2. Для Python 3 замените print(display.next_event()) на print(display.next_event()) с учётом синтаксиса Python 3 (то есть в скрипте выше синтаксис уже соответствует Python 3). Если у вас есть только python3, используйте #!/usr/bin/env python3.
Сделать файл исполняемым
Через GUI: правый клик по файлу → Свойства → Вкладка «Права» → включите «Разрешить выполнение файла как программы».
Через терминал:
chmod +x ~/bin/screen_off.py

ALT: Схематичное изображение выключения монитора клавишей в Ubuntu
Назначение горячей клавиши
- Откройте «Настройки» → «Клавиатура» → «Сочетания клавиш».
- Нажмите «Добавить» (или «+»), задайте имя и в поле «Команда» укажите полный путь к вашему скрипту, например /home/vasya/bin/screen_off.py
- После добавления нажмите на поле «Сочетание» и укажите желаемую клавишу.
Если хотите назначить Caps Lock: сперва отключите поведение Caps Lock в «Клавиатура → Макеты → Параметры клавиатуры» и выберите «Отключить Caps Lock». В интерфейсе может отображаться как “VoidSymbol”, но назначение будет работать.

ALT: Окно текстового редактора gedit с открытым кодом Python-скрипта для выключения экрана

ALT: Окно свойств файла в Ubuntu со включённой опцией разрешения на выполнение

ALT: Параметры раскладки клавиатуры — отключение Caps Lock

ALT: Окно настроек сочетаний клавиш в Ubuntu, добавление нового ярлыка
Почему этот скрипт надёжнее простого xset в цикле
- Скрипт захватывает ввод мыши и клавиатуры через Xlib, поэтому точно знает, когда придёт следующее событие, и не пускает «фальшивые» события, которые раньше могли разбудить экран.
- Запуск xset в цикле потребляет CPU и неудобен для отмены; здесь мы выполняем один вызов xset и ждём реального события.
Когда это не сработает
- Wayland: Wayland не поддерживает Xlib — используйте инструменты, специфичные для Wayland (например, wlroots-утилиты или API DE).
- Окружения с нестандартными screensaver/locker: если оконный менеджер или окружение активно генерирует события ввода или программно меняет DPMS, поведение может отличаться.
Альтернативные подходы
- xrandr: можно понижать яркость или отключать вывод через xrandr, но это управляет самим выводом, а не DPMS.
- systemd-inhibit / power profiles: использовать управление питанием на уровне системы, чтобы переводить машину в легкий спящий режим.
- D-Bus-методы DE: некоторые окружения предоставляют D-Bus API для блокировки экрана и отключения дисплея.
Тесты и критерии приёмки
- Скрипт должен погасить экран при нажатии назначенной клавиши.
- Экран остаётся погашенным до следующего реального события ввода (клик или клавиша).
- CPU не растёт до 100% во время ожидания события.
- Скрипт корректно завершается после пробуждения экрана.
Устранение неполадок
- Скрипт ничего не делает: проверьте наличие python-xlib и права на выполнение.
- Скрипт завершился с ошибкой Display(‘:0’): возможно, DISPLAY отличается (используйте echo $DISPLAY в терминале, чтобы узнать текущий дисплей, и подставьте Display(os.environ[‘DISPLAY’])).
- При работе в Wayland: используйте X11-сессию (на экране входа выберите Xorg) или ищите Wayland‑специфичный инструмент.
Совместимость с Python 3
Если ваша система использует только Python 3, замените shebang на #!/usr/bin/env python3 и убедитесь, что синтаксис print корректен (в данном примере print уже использует скобки).
Риски и безопасность
- Скрипт захватывает ввод (grab_pointer/grab_keyboard) — это штатный механизм X; неправильно модифицированный код может оставить захват незавершённым. Всегда тестируйте в контролируемой сессии.
- Не запускайте сомнительные скрипты с правами root — этот скрипт не требует повышения привилегий.
Короткий глоссарий
- DPMS: стандарт энергосбережения монитора (Display Power Management Signaling).
- Xlib: библиотека взаимодействия с X11-сервером.
- Xorg/X11: классический сервер отображения графики в Linux.
Шаблон проверки перед выкладкой (Checklist)
- Зависимости установлены (python, python-xlib)
- Скрипт сохранён и доступен по полному пути
- Файл помечен как исполняемый
- Горячая клавиша назначена и протестирована в X11-сессии
Итог
Это простой и надёжный метод вернуть функциональность выключения монитора по горячей клавише в Ubuntu при использовании X11. Он экономит батарею и работает лучше циклических вызовов xset. Если вы перешли на Wayland, рассмотрите DE‑специфичные решения.
Важное: если что-то идёт не так — проверяйте текущую переменную DISPLAY и убедитесь, что вы в X-сессии.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента