モニターが接続されているときにXプログラムを実行する

モニターが接続されているときにXプログラムを実行する

私のコンピュータに奇妙なバグがあります。モニターの電源を切ってからもう一度入れても、画面は空白のままです。これはXでログインした場合にのみ発生します(Gdm画面では発生しません)。画面を明るくする方法を見つけました。

xset dpms force off
xset dpms force on

モニターの電源が入っているときにこれらのコマンドを自動的に実行できますか?

モニターはDisplayPortを介して接続され、EDID情報を報告します。オペレーティングシステムはUbuntu 18.04です。

ポーリングベースのソリューションは許可されていません。モニターを開くと待たずに応答する必要があるため、ポーリングには非常に短い間隔が必要ですが、これは頻繁に発生しないタスクであるため、CPUが1秒未満の間隔でタスクを実行するのに十分な熱を維持するという保証はありません。私は〜を探していますトリガーモニターが接続されると、X セッションで実行されます。

答え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

それは行動するモニターの変更。これには、モニターの電源をオフにする操作が含まれ、複数のモニターを区別しません。しかし、この特定のコンピュータにはモニタが1つしかないので、私にとっては十分です。

udevスクリプトXセッション検出(通常、このUbuntu 18.04のデフォルト設定ではtty2で実行されます。) X 呼び出し行は、Gdm を使用して X サーバーを呼び出すと仮定します。 Gdmを使用していない場合は、このセクションを変更する必要があります。

私はdbusベースのソリューションが好きですが、どのイベントに反応するのかわかりません。

関連情報