Solution for “Gtk-WARNING **: cannot open display:” on Ubuntu 16.04
先日Ubuntu 14.04からUbuntu 16.04にアップグレードした。しかし,Gnomeのアプリを起動しようとすると起動できなかった。解決できたのでメモしておく。
結論を先に書くと,環境変数DISPLAYは自分で設定するのではなく,~/.bashrc
などで以下のとおりに設定されていないときだけ,既定値の:0
を設定すればよい。
export DISPLAY="${DISPLAY:-:0}"
Trouble
例えば,テキストエディタであるgedit
をターミナルから起動しようとすると以下のエラーが出た。
gedit
Gtk-Message: Failed to load module "unity-gtk-module"
No protocol specified
** (gedit:19866): WARNING **: Could not open X display
No protocol specified
(gedit:19866): Gtk-WARNING **: cannot open display: :0.0
環境変数DISPLAYの値は:0.0
としている。以下のコマンドでDISPLAY変数の値を一時的に無効化してgedit
を起動するとエラー内容が若干変化した。
DISPLAY="" gedit
Gtk-Message: Failed to load module "unity-gtk-module"
(gedit:20071): Gtk-WARNING **: cannot open display:
EvinceやGIMPなどのGTK+をベースとした優れたGnomeのアプリを端末から使えないのは不便なので,解決策を調べた。
Solution
まず,最初に両方のエラーに表示されていた以下のメッセージに注目して調べてみた。
Gtk-Message: Failed to load module "unity-gtk-module"
すると,最初に以下のサイトにたどり着いた。
Ubuntu 16.04, D1000 Docking Station, displaylink-driver-1.1.62 – DisplayLink Forum
このサイトで回答されている通りに,以下のコマンドを入力してみたのだけど,解決しなかった。
sudo apt-get install --reinstall ubuntu-desktop
続いて,cannot open display:のメッセージからX Window System関係の問題かなと思って調べてみたところ,以下のサイトにたどり着いた。
command line – Can’t launch graphical apps from terminal after updating to 15.10 – Ask Ubuntu
このサイトでsssemilが回答しているように,DISPLAY=:1
のとおりに環境変数に値を設定して起動してみる。
DISPLAY=:1 gedit
起動に時間がかかったものの,うまく起動できた。
Cause
今までよくわからないまま,~/.bashrc
などで環境変数DISPLAYには以下のとおりに:0.0
を設定していた。
export DISPLAY=:0.0
これがまずかったようだ。ちょっと調べてみた。man X
コマンドかこのサイトでヘルプを確認できる。Display Namesセクションを一部翻訳しながらまとめてみる。
DISPLAY環境変数の値の書式は以下のとおりになっている。
DISPLAY=<hostname>:<displaynumber>.<screennumber>
この情報は,デフォルトでサーバーとスクリーンに接続する方法を決めるために,アプリケーションで使われる。
項目 | 説明 | 既定 |
---|---|---|
hostname | ディスプレイが物理的に接続されているマシン名を指定する。指定しなければ,サーバーと最も効率のよいマシン名が使われる。 | 自動 |
displaynumber | ディスプレイとは,キーボードやマウスポインターを共有するモニターを指す。多くのPCでは1PCにつき1モニターを持つ。マルチユーザーシステムでは,ログインユーザーごとにディスプレイが存在し,それぞれ割り当てられる。混乱を避けるため,Xサーバーの起動時に,各ディスプレイに0から始まるディスプレイ番号が割り当てられる。ディスプレイ番号はいつもディスプレイ名で与えられないといけない。 | – |
screennumber | キーボードとマウスポインターを共有するディスプレイ。Xサーバーの起動時に,各モニターは自分のウィンドウを持ち,各スクリーンは0から始まるスクリーン番号を割り当てられる。番号を指定しなければ0が使われる。 | 0 |
<hostname>と<screennumber>は既定値があるので,基本的には<displaynumber>だけ自分で設定すればよさそうだ。また,以下で言及があるようにPOSIX準拠である大半のLinuxではDISPLAY環境変数の既定値が存在する模様。
On POSIX systems, the default display name is stored in your DISPLAY environment variable. This variable is set automatically by the xterm terminal emulator. However, when you log into another machine on a network, you may need to set DISPLAY by hand to point to your display.
このことから,基本的には自分で設定する必要はないだろう。しかし,CygwinやMSYS2などでは環境変数DISPLAYの値が設定されていない環境もありえるため,エラーを回避する必要がある。そこで,DISPLAY環境変数が存在すればその値を使い,そうでなければ自分で設定すればよいだろう。設定値についても,基本的には既定値の:0
を使えばよい。
これらのことを考慮して,以下の設定を~/.bashrc
などに書いておけば今後も大丈夫だろう。
export DISPLAY="${DISPLAY:-:0}"