起動時に実行される場合もあり、実行されない場合もある起動スクリプトがあります(理由はわかりません)。スクリプトがキーボードのキーを交換するため、デスクトップがロードされた後にキーを交換する必要があるため、これが問題になります。サービスを作成しましたが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アプローチに固執する場合は、最も簡単な方法はviaExecStartPost
にdisplay-manager.service
追加の作業を追加することですsystemctl edit display-manager.service
。
しかし、最善の方法は、ディスプレイマネージャが起動時に使用するファイルを見つけて、そのファイルを変更してスクリプトを実行することです。私はsystemdがこのようなローカル変更に比べて重すぎると思います。
答え2
通常、systemd サービスは X11 で作業を実行するのには適していません。これは、ログインプロンプトを入力する前にディスプレイを初期化するスクリプトで実行するか、ユーザーセッション起動スクリプトの一部として実行する必要があります。
また、国際化ツールもキーボードを再マップし、xmodmapを使用しようとするすべての試みはせいぜい一時的なので、xmodmapはキーバインディングを変更する古い方法のようです。 I18n ツールはいつでもキーボードを再マップし、xmodmap を削除するためです。画面がロックまたはロック解除され、ユーザーGUIセッションマネージャが再初期化されたとき。