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
です。
以下の記事で説明しているような方法で、キーバインドの入れ替えを行ないたいのです。
Ubuntu 起動直後に xmodmap コマンドを実行して自分好みのキーバインドを適用したいというシンプルな要求があったのですが、当然 .bashrc などに書いてもその要求は叶いません。おそらく GUI のシステムの起動時に実行されるスクリプトがあるはずだろうと思っていろいろ調べたのですが、「そもそも今の Ubuntu って X Window なの?なんか Wayland?とかいうのがあるらしいけど・・・」とかそのあたりから知識が足りません。
それでもなんとか以下のような Stack Exchange の質問にたどり着きました。
どうやら 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
コマンドを実行していますが、複雑な処理をしたい場合はスクリプトを用意してそれを実行するようにすると良いかもしれません。
Type
は Application
Link
Directory
のうちのいずれかを指定するようで必須のフィールドですが、 Link
と Directory
はよくわからないのでおそらく Application
でよいでしょう。
たったこれだけの記述で自動実行できるようになっただなんて・・・これまでの数年間、Ubuntu を起動するたびに xmodmap
コマンドを手で実行していた自分が馬鹿らしくなりました。