Запуск X-программы при подключенном мониторе

Desde su escenario dado, por lo que entiendo y sé por experiencias pasadas, una actualización también recreará (los archivos de configuración predeterminados ).

En su caso será necesario implementar algún tipo de gestión de configuración. Pueden ser secuencias de comandos adicionales, herramientas o incluso una infraestructura más avanzada.

1
30.06.2019, 00:11
1 ответ

У меня есть решение с использованием udev. Он не прочный,но достаточно хорошо в моем случае.

Создать файл/etc/udev/rules.d/99-monitor.rules(точное имя файла не имеет значения, если оно содержит только буквы, цифры, _и -плюс расширение .rules):

KERNEL=="card0", SUBSYSTEM=="drm", ACTION=="change", RUN+="/usr/local/sbin/monitor-change.udev.sh"

Создать файл /usr/local/sbin/monitor-change.udev.shи сделать его исполняемым:

#!/bin/bash
set -e

start_logging () {
  exec >/var/log/monitor-change.log 2>&1
  echo
  set -x
  date
}

awaken_monitor () {
  # Hack: the monitor stays blank, but forcing it off then on in software
  # somehow turns it on.
  xset dpms force off
  xset dpms force on
}

detect_xorg () {
  tty=/dev/tty$(fgconsole)
  # Find Xorg running on the foreground console
  pids=$(fuser "$tty" 2>/dev/null)
  auth_regexp=' -auth ([^ ]*)'
  for pid in $pids; do
    args=$(ps -o args= -p $pid)
    if [[ "$args" = /usr/lib/xorg/Xorg* ]] &&
       [[ "$args" =~ $auth_regexp ]]
    then 
      # Hard-code DISPLAY=:0 because it's hard to detect
      export DISPLAY=":0" XAUTHORITY="${BASH_REMATCH[1]}"
      return 0
    fi
  done
  return 1
}

#start_logging
detect_xorg
awaken_monitor

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

Сценарий udev обнаруживает X-сессию (, которая обычно работает на tty2 в этой настройке Ubuntu 18.04 по умолчанию ). На этой машине только один пользователь, поэтому я делаю все просто. Обратите внимание, что строка вызова X предполагает способ Gdm вызова X-сервера; вам может понадобиться изменить эту часть, если вы не используете Gdm.

Я бы предпочел решение на основе dbus -, но не знаю, на какое событие реагировать.

2
27.01.2020, 23:30

Теги

Похожие вопросы