ターミナルの突然死に備える
ターミナルが動かなくなりました。それも突然。 身に覚えのない理不尽な仕打ちですが、 不思議と全くイライラしないのが Linuxの不思議なところですね。 おそらく坊主が好きだと 袈裟まで好きになる現象だと思います。
なお環境は以下です。
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.6 LTS
Release: 16.04
Codename: xenial
そもそもターミナルってなに?
どうやら今までターミナルだと思っていたものは
gnome-terminal
という機能だったようです。
朝起きたらとりあえず <CTRT> <ALT> t
で
無意識に立ち上げていたので全く知りませんでした。
話を戻しますが、
このターミナルが動かなくなって一番こまったことは
ターミナルをターミナル上で
起動できないことでした。
というのも、一度動かせれば
プロセスを確認できるのですが、
そもそもターミナルが動かないので詰んでる感がありました。
そこで色々と見てみたところ、
gnome-terminal
という機能を今まで使っていたことに気づきました。
ちなみにターミナルは
gnome-terminal
以外にも色々とあって、
fishとか
xtermとかあります。
今回命拾いしたのも xterm
があったからですね。
僕はとにかく黒い画面を見て安心したかったので、
xtermを探して起動しました。
そこでxterm上で gnome-terminal
と入力すると、
見慣れない下のエラー文に遭遇したわけです。
ImportError: cannot import name '_gi'
原因と直し方
このエラー文が意味するところは文字通り
_gi
を import
できないよー、というところなのです。
で、このエラーをぐぐってみたところ、
どうやらエラーの原因は
「terminalが要求するPythonのバージョン」と
「ユーザーが設定しているPythonのバージョン」の
コンフリクトでした。
というのも、
UbuntuのPythonは2.7と3.5がデフォルトだったのですが、
先日3.6にしたため喧嘩してしまったようです。
直し方には少なくとも2つ手段があります。
1つは /usr/bin/gnome-terminal
の先頭に
以下の行を追加してあげます。
#!/usr/bin/python3.5
これで明示的に「pythonは3.5を使いますよー」と教えてあげられます。
ただ、たぶん sudo
で実行せねばならないので、
sudo vim /usr/bin/gnome-terminal
のようなコマンドが必要になると思います。
もう1つは Gnome terminal will not start で見かけた解決法なのですが、 シンボリックリンクを貼り直す、という手法もあるようです。 自分で検証していないのでここでは詳しく説明しませんが、あくまでも情報として。
まとめ
今回はターミナルが動かなる原因の例として、 デフォルトのPythonを変えてしまった事例を共有しました。 また、 その解決方法としてファイルを書き換える方法と、 シンボリックリンクを貼り直す方法を紹介しました。 とにかく、エラーログを読むのが大切ということですね。
余談ですが、今回助かったのはxtermがあったからなのですが、 もともとterminalしかない Windows Subsystem for Linux だとどうなるのかなぁ、とか気になっています。 もしかして即死でしょうか。 (試さないでください)