背景
Ubuntu 18.04 (Server)に LXDE+XRDP環境を作り、WindowsからRDP接続した上で、GUI操作を行うプログラムを実行しようとした際に掲題のエラーが発生した。
じゃあ今このPCからリモートデスクトップ接続して見えている画面は何なんだよ!と思いながら調べた。
原因は環境変数のDISPLAYと実際の仮想ディスプレイ番号があっていないからだった。なぜ合わなくなったのかはわからない。ただ、環境変数を合わせれば動くようになったので、その直し方を書いておく。
直し方
-
CUI操作ではないことを確認する(SSH接続の場合、
env | grep DISPLAY
等で環境変数DISPLAYが設定されていない) - 以下のいずれかを確認し、操作に使っているディスプレイ番号を把握する
-
ps -ef | grep Xorg
で自分が実行者のプロセスがあり、そこから確認する(引数に:10
の存在が確認できれば、10がディスプレイ番号になる) -
ls -l /tmp/.X11-unix
で自分が所有者のUNIX Domain Socketのファイルがあり、そこから確認する(例えばX10
があり、その所有者が自身であれば10がディスプレイ番号になる)
-
- 環境変数
DISPLAY
があり、上記の2つのいずれかで表示されたディスプレイ番号が指定されているか確認する(例: ディスプレイ番号=10ならば、:10
もしくは:10.0
など)
環境変数 DISPLAY
が正しく設定されていない場合、export DISPLAY=:10
という形で設定してからプログラムを実行する。
蛇足
export DISPLAY=:0
をやれば解決した、というだけの記事をしばしば見かけたが、解決できなかったので調べて書いた。
X Window Systemについてはman X
で結構色々書かれてる。全然読み解けなかった。分かったのは下記ぐらい。
- X Window SystemはUNIX domain socket接続(ローカル接続)、TCP接続(リモート接続)を選べる。
- 環境変数
DISPLAY
のフォーマットはhostname:displaynumber.screennumber
で、hostnameとscreennumberは省略可能。:displaynumber
が最小限必要で、hostnameは空文字列扱いでUnix domain socket接続となり、screennumberは0と同じ意味だそうだ。
xorgは X Window System の実装の一つなので、ps -ef | grep Xorg
で確認できない環境があるかもしれない。(xorg以外というとwaylandとか?使ったことが無いので分からない。)