Изменить поведение гашения экрана консоли Linux

38

Как изменить поведение гашения экрана на виртуальных терминалах Linux?

Например, если я переключусь на VT с X, войду в систему и оставлю систему в покое на 5 минут или около того, экран станет пустым, как заставка. Он возвращается с любым нажатием клавиши, как заставка.

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

Если это поможет, одна из моих систем работает под управлением Ubuntu 10.04 со стандартными графическими драйверами. fbsetпоказывает консоль, использующую radeondrmfbустройство кадрового буфера.

шарлатан
источник
2
Надеюсь, это поможет вам, я нашел это, когда я встретил тот же вопрос askubuntu.com/questions/138918/…

Ответы:

42

settermот @ whitequark это ответ является разумным инструментом в пользовательском пространстве, но это не вся история.

Поведение по умолчанию при блокировке консоли включается в ядро ​​во время компиляции. Это настраивается во время загрузки с параметром consoleblank = или в пользовательском пространстве с помощью setterm. Из документации ядра ( kernel-parameters.txt ):

consoleblank=  [KNL] The console blank (screen saver) timeout in
               seconds. Defaults to 10*60 = 10mins. A value of 0
               disables the blank timer.

Вот варианты, их настройки по умолчанию в моей системе Ubuntu и сферы их влияния:

  • setterm -blank [0-60]; всегда сообщает 0 при запросе; эффективен при работе на реальном VT; влияет на все настоящие TTY; не эффективен при запуске в сеансах экрана на VT.
  • setterm -powerdown [0-60]; всегда сообщает "3]" (??); кажется, не имеет никакого эффекта. Ядра Ubuntu не включают APM_DISPLAY_BLANK , и это может быть связано.
  • consoleblank=N; по умолчанию 600 (10 минут); влияет на все реальные ВТ; влияет на сеансы экрана в VT; нет способа установить во время работы.

Таким образом, мои варианты для изменения по умолчанию один из следующих:

  1. Добавьте setterm -blank X(X в минутах, 0 для отключения) в файл инициализации оболочки, например .bashrc .
  2. Добавьте setterm -blank Xв /etc/rc.local .
  3. Добавьте consoleblank=Y(Y в секундах, 0 для отключения) к командной строке ядра, добавив ее в списки параметров в / etc / default / grub , либо GRUB_CMDLINE_LINUX, либо GRUB_CMDLINE_LINUX_DEFAULT . (Не забудьте update-grub.)
шарлатан
источник
4
Я хотел бы отметить, что setterm -blank Xэто не сработало для меня из tmux , но отлично работало, когда я выходил из tmux перед запуском команды.
Коди Хесс
1
Если вы используете grub2 в качестве загрузчика, вы можете добавить этот параметр ядра в / etc / default / grub GRUB_CMDLINE_LINUX_DEFAULT="consoleblank=0"и затем обновить конфигурацию grub с помощью grub[2]-mkconfig -o /boot/grub/grub.cfg.
user3132194
3]for setterm -powerdown- только половина истинного: setterm -powerdown 3 | hexdump -cвозвращает 033 [ 1 4 ; 3 ]. Не уверен, что следует интерпретировать эту escape-последовательность ...
Даниэль Алдер
1
В зависимости от вашего дистрибутива и того, где вы хотите, чтобы изменения вступили в силу, некоторые из этих параметров могут не работать. Я обнаружил, что setterm в rc.local отлично работает для RHEL 5 и 6, но не для 7.
Дэвид С.
9

Попробуйте setterm -blank $minutes(или передайте 0, чтобы отключить); -powersaveВариант также может быть связан. settermтакже есть множество других полезных опций.

Если вы хотите установить эти атрибуты при запуске системы, подумайте о написании начального сценария. Это просто скрипт, размещенный в /etc/init.dкаталоге. Пусть это будет называться setterm:

#!/bin/sh
[ "$1" == "start" ] || exit 0 # only initialize everything when called as /etc/init.d/setterm start
for term in /dev/tty[0-9]*; do # select all ttyNN, but skip ttyS*
    setterm -blank 0 >$term <$term
    setterm -powersave off >$term <$term
done

Затем сделайте его исполняемым:

# chmod +x /etc/init.d/setterm

И наконец, создайте символические ссылки /etc/rcX.d (путь Debian):

# update-rc.d setterm defaults

(Если вы устали от такого поведения, сделайте # update-rc.d -f setterm remove. Обратите внимание, что это -fдолжен быть первый аргумент).

whitequark
источник
HRM. кажется полезным для «на лету», хотя в моей тестовой системе Ubuntu кажется, что это действительно -powerdownнастройка, которая действует. как насчет настройки загрузки по умолчанию для всей системы? работает setterm -blank Xили setterm -powerdown Yв /etc/rc.local (или ~ / .bashrc ) разумно?
Квик-кихот
1
Да, но только если на rc.localсамом деле работает. (Недавняя upstartмиграция испортила некоторые вещи, поскольку она, очевидно, существует и работает в моей системе.) В противном случае вы должны создать начальный скрипт. Это легко: в нашем случае он должен инициализировать все, когда передается в startкачестве первого аргумента, и ничего не делать иначе. Я опишу это в своем ответе.
whitequark
setterm -blank X >/dev/ttyNКажется, команда не работает, поэтому я не думаю, что концепция initscript будет работать. наткнулся на параметр времени загрузки tho и провел еще несколько исследований. я, кажется, ошибаюсь насчет -powerdownи -powersave; не полностью протестированы, но они не работают в моей системе. setterm -blank Xработает, только от реального VT, и влияет на все VT, поэтому разумно запускать один раз через /etc/rc.local . (Upstart не убирает rc.local , только материал /etc/rcX.d .)
Квик-кихот
1
Гм. Кажется, что settermгенерирует escape-последовательности stdout, но проверяет тип TTY с помощью stdin: Я только что проверил, и setterm ... >/dev/ttyN </dev/ttyNработает как задумано.
Уайткварк
это имеет смысл, и это работает (из реального TTY), но какой смысл вообще использовать этот синтаксис? (1) по-прежнему не работает изнутри экрана (или, возможно, других PTY), где было бы полезно указать / dev / ttyN; (2) установка одного VT влияет на все, поэтому нет необходимости в цикле initscript.
Квик-кихот
3

Если кто-то ищет другое возможное решение для Debian (возможно, не Ubuntu):

В /etc/kbd/config, найдите параметр под названием «BLANK_TIME»:

# screen blanking timeout.  monitor remains on, but the screen is cleared to
# range: 0-60 min (0==never)  kernels I've looked at default to 10 minutes.
# (see linux/drivers/char/console.c)
BLANK_TIME=30

Измените его на 0, это отключит его:

BLANK_TIME=0

Протестировано на Debian 6 и 7.

basic6
источник
2

Если вы используете более новую версию Ubuntu, которая использует upstart, вы можете использовать:

for file in /etc/init/tty*.conf; do tty="/dev/`basename $file .conf`"; echo "post-start exec setterm -blank 0 -powersave off >$tty <$tty" | sudo tee -a "$file"; done

Небольшое объяснение того, что здесь происходит:

Более новые версии Ubuntu используют upstart для запуска системы. С помощью upstart консоли Linux настраиваются с файлами конфигурации, которые хранятся в / etc / init. Команда выше начинается с перебора каждого из этих файлов конфигурации:

for file in /etc/init/tty*.conf;

Имя конфигурационного файла tty в $ file используется для создания имени устройства tty:

tty="/dev/`basename $file .conf`";

Создается команда upstart «post-start», которая запускает «setterm», чтобы отключить блокировку экрана и энергосбережение после запуска tty:

echo "post-start exec setterm -blank 0 -powersave off >$tty <$tty"

И, наконец, эта команда добавляется в файл конфигурации upstart:

| sudo tee -a "$file";
Крис Пик
источник
2

В моих системах (различные выпуски RedHat Enterprise Linux) я обнаружил, что нужны разные подходы.

Для моих систем RHEL 5 и 6 я могу добавить строку

/bin/setterm -blank 0 -powerdown 0 -powersave off

к /etc/rc.local. Это отключает блокировку экрана консоли при запуске системы.

Я обнаружил, что это не работает в системах RHEL 7. На RHEL7 при запуске setterm из rc.local генерируется ошибка:

setterm: $TERM is not defined.

Команда работает из интерактивной оболочки, в которой определен $ TERM (как linux). Если я заставлю setterm использовать его:

/bin/setterm -term linux -blank 0 -powerdown 0 -powersave off

Тогда я получаю другую ошибку:

setterm: cannot (un)set powersave mode: Inappropriate ioctl for device

Хотя та же команда отлично работает в интерактивном сеансе. Настройкаconsoleblank параметра ядра сработала.

На RHEL7, редактировать /etc/default/grubи добавлять consoleblank=0к GRUB_CMDLINE_LINUXпараметру. Тогда бегиgrub2-mkconfig -o /boot/grub2/grub.cfg и перезагрузите компьютер.

Я не пробовал устанавливать consoleblankRHEL5 или 6.

Дэвид С.
источник
2
RHEL7 использует systemd; По умолчанию rc.local не подключен к терминалу. Я думаю, что вы можете добавить </dev/tty1 >/dev/tty1или что-то, чтобы заставить это работать
sourcejedi
1

Частные последовательности CSI консоли Linux

Чтобы установить sleep mode/screensaverвремя входа (где X - время в минутах; 0 = никогда):

(с последовательной консоли)

echo -e '\033[9;X]' > /dev/tty1    

или (с консоли кадрового буфера)

echo -e '\033[9;X]'    

или чтобы установить его при каждой загрузке, используйте /etc/inittab:

tty1::sysinit:echo -e '\033[9;X]'

рефов:

yurenchen
источник
0

Добавление gnome-screensaver-command --exitв мой .profileфайл исправило эту проблему для меня в Debian Linux (Wheezy).

Думаю, я бы добавил это, чтобы помочь другим, которые тянут свои волосы, пытаясь остановить гашение экрана.

Флажок под названием «Тусклый экран для экономии энергии» работает неправильно. Даже если этот флажок не установлен, он все равно будет очищать экран в соответствии с выбранным временем бездействия.

ОБНОВЛЕНИЕ: я действительно должен sleep 30 && /usr/bin/gnome-screensaver-command --exit &был заставить это работать должным образом. Заставка GNOME запускается спустя много времени после обработки .profile.

mcchinsy
источник
3
Речь идет о гашении экрана консоли, а не заставках Gnome.
basic6