systemdでxmodmapを実行する

systemdでxmodmapを実行する

起動時に実行される場合もあり、実行されない場合もある起動スクリプトがあります(理由はわかりません)。スクリプトがキーボードのキーを交換するため、デスクトップがロードされた後にキーを交換する必要があるため、これが問題になります。サービスを作成しましたがsystemd機能しません。これは私のサービスファイルです。

# /etc/systemd/system/keySwap.service

[Unit]
Description=Swaps right Option key with Right CMD key
After=display-manager.service

[Service]
ExecStart=/home/jedrek/keyboard_keys_swapper.sh

[Install]
WantedBy=default.target

グラフィカル環境の端末でサービスを手動で実行するとエラーが発生します。

sudo systemctl start keySwap
sudo systemctl status keySwap

● keySwap.service - Swaps right Option key with Right CMD key
     Loaded: loaded (/etc/systemd/system/keySwap.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Tue 2022-04-05 18:57:24 CEST; 4s ago
    Process: 12028 ExecStart=/home/jedrek/keyboard_keys_swapper.sh (code=exited, status=1/FAILURE)
   Main PID: 12028 (code=exited, status=1/FAILURE)

kwi 05 18:57:24 Home systemd[1]: Started Swaps right Option key with Right CMD key.
kwi 05 18:57:24 Home keyboard_keys_swapper.sh[12029]: xmodmap:  unable to open display ''
kwi 05 18:57:24 Home keyboard_keys_swapper.sh[12030]: xmodmap:  unable to open display ''
kwi 05 18:57:24 Home systemd[1]: keySwap.service: Main process exited, code=exited, status=1/FAILURE
kwi 05 18:57:24 Home systemd[1]: keySwap.service: Failed with result 'exit-code'.

シェルスクリプトは単にキーを交換します。

#!/bin/bash
xmodmap -e "keycode 108 = Super_R"
xmodmap -e "keycode 134 = ISO_Level3_Shift"

これを行うには、グラフィックデスクトップをロードする必要があることを知っていますが、xmodmapなぜ機能しないのか理解できません。私の問題をどのように解決できますか?

ベストアンサー1

すべてのXプログラムはどのモニタと通信する必要があるかを知る必要があり、これはDISPLAY環境変数を介して行われます。グラフィックスデスクトップで端末を実行すると、この値が何であるかを確認できます。echo $DISPLAY

通常、:0現在のホストの最初のディスプレイに変換されるため、スクリプトに行を追加して設定してexport DISPLAY=:0操作できます。

だから、これはあなたを続けることができます...

ただし、その計画を再検討することもできます。作成したとおりにxmodmap操作が実行されると、スクリプトは終了するため、システムデバイスファイルのみが再起動されます。Type=oneshotと一緒にサービスとして作成することをお勧めしますRemainAfterExit=true。次回の起動時に再起動したいので、ディスプレイマネージャのシャットダウンターゲット(plymouth-quit.service私のgnomeベースのシステム)と競合してシャットダウンする必要があります。少し複雑になるのがわかります。

systemdアプローチに固執する場合は、最も簡単な方法はviaExecStartPostdisplay-manager.service追加の作業を追加することですsystemctl edit display-manager.service

しかし、最善の方法は、ディスプレイマネージャが起動時に使用するファイルを見つけて、そのファイルを変更してスクリプトを実行することです。私はsystemdがこのようなローカル変更に比べて重すぎると思います。

おすすめ記事