LoginSignup
22
9

More than 5 years have passed since last update.

`cannot connect to X server` が出たときの確認することと直し方

Posted at

背景

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とか?使ったことが無いので分からない。)

22
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
9