Ubuntu 20.04 で GUI 起動時に任意のプログラムを実行したい

表題の件ですが、簡単だろうと思っていたら意外とハマったのでメモしておきます。

まず前提条件の整理から。

自宅で仕事用に使っている Ubuntu Desktop 20.04 で、GUI にログインした直後に実行したいプログラムがありました。

仮想マシンとか WSL のような環境ではなく、ベアメタルにインストールされている以下のような環境です。

$ uname -a
Linux ogubuntu 5.4.0-94-generic #106-Ubuntu SMP Thu Jan 6 23:58:14 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.3 LTS
Release:    20.04
Codename:   focal

GUI にログインした直後に実行したいプログラムは具体的には xmodmap です。 以下の記事で説明しているような方法で、キーバインドの入れ替えを行ないたいのです。

bearmini.hatenablog.com

Ubuntu 起動直後に xmodmap コマンドを実行して自分好みのキーバインドを適用したいというシンプルな要求があったのですが、当然 .bashrc などに書いてもその要求は叶いません。おそらく GUI のシステムの起動時に実行されるスクリプトがあるはずだろうと思っていろいろ調べたのですが、「そもそも今の Ubuntu って X Window なの?なんか Wayland?とかいうのがあるらしいけど・・・」とかそのあたりから知識が足りません。

それでもなんとか以下のような Stack Exchange の質問にたどり着きました。

unix.stackexchange.com

どうやら GUI 起動時に読み込まれそうなスクリプトとしては .xinitirc .xsession .xsessionrc などがありそうだということがわかりました。

そこで以下のようなスクリプトを書いてみました。

$ cat ~/.xinitrc 
(
    if [ -s ~/.Xmodmap ]; then
        /usr/bin/xmodmap ~/.Xmodmap
    fi
) >~/.xinitrc.log 2>&1

(↑は .xinitrc の例ですが、.xsession.xsessionrc も同様の内容で作成しました。)

結果として、.xinitrc.xsession は実行されず、 .xsessionrc は実行されるのですが xmodmap コマンドがエラーを起こすという状況でした。エラーメッセージの内容的には、bad keysym in remove modifier list 'Alt_R', no corresponding keycodes といったようなもので、存在しているはずのキーコードが存在しないと言われているのでちょっとよくわからない感じです。 同じコマンドを、起動後に手で実行するとこのようなエラーは発生しないのでちょっと実行されるタイミングが早すぎたりするような感じなのでしょうか。

他に、.xprofile というファイルも実行されるらしいことがわかりましたので同様に試してみたのですが、こちらは実行されて xmodmap コマンドも正常に実行されるようでしたが、なぜかログイン後の GUI 環境では xmodmap の効果が現れません。(つまりキーの入れ替えが行われていない状態) ちょっとどういうことなのかよくわかりません。

ほかに有力な情報も見つかりませんでしたし、不便だなとは思いつつ Ubuntu を起動する度に真っ先に Terminal を立ち上げて xmodmap コマンドを実行することでなんとかしのいでいました。 再起動なんて月に 1〜2 回くらいしかしないので仕方ないと思いながらすでに何年も経ってしまっていたのですが、やはり毎回同じコマンドを手で入力し続けるのはさすがにプログラマとしての名がすたると思って更に調べていくと以下のような情報を見つけました。

GNOME を利用している場合は $HOME/.config/autostart/.desktop という拡張子を持つファイルを作り、その中に 仕様 に従って設定を書けば起動時に実行されるらしいということがわかりました。

たしかに $HOME/.config/autostart/ 以下には起動時に自動的に実行されるアプリの名前が並んでいました。

試しに $HOME/.config/autostart/xmodmap.desktop という名前で以下のようなファイルを置いてみました。

[Desktop Entry]
Name=run xmodmap at startup
Exec=xmodmap /home/bearmini/.Xmodmap
Type=Application

恐る恐る Ubuntu を再起動してみると・・・ログイン直後から xmodmap が実行された状態になっています! やりました!

一応ファイルの中身を説明すると、 Name はアプリケーションの名前です。一般に公開するアプリというわけではないので自分でわかる名前を付けましょう。一応 GNOME Tweak Tool の Startup Applications の一覧に表示されるときに使われる名前になります。 Exec は実行されるコマンドと引数です。ここでは直接 xmodmap コマンドを実行していますが、複雑な処理をしたい場合はスクリプトを用意してそれを実行するようにすると良いかもしれません。 TypeApplication Link Directory のうちのいずれかを指定するようで必須のフィールドですが、 LinkDirectory はよくわからないのでおそらく Application でよいでしょう。 たったこれだけの記述で自動実行できるようになっただなんて・・・これまでの数年間、Ubuntu を起動するたびに xmodmap コマンドを手で実行していた自分が馬鹿らしくなりました。