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 접근 방식을 고집한다면 가장 쉬운 방법은 via ExecStartPostdisplay-manager.service추가 작업을 추가하는 것 입니다 systemctl edit display-manager.service.

하지만 가장 좋은 방법은 디스플레이 관리자가 시작 시 사용하는 파일을 찾아 해당 파일을 수정하여 스크립트를 실행하는 것입니다. 나는 systemd가 이와 같은 로컬 변경에 비해 너무 무겁다고 생각합니다.

답변2

일반적으로 systemd 서비스는 X11에서 작업을 수행하는 데 적합하지 않습니다. 이는 로그인 프롬프트를 제공하기 전에 디스플레이를 초기화하는 스크립트에서 수행되거나 사용자 세션 시작 스크립트의 일부로 수행되어야 합니다.

또한 국제화 도구도 키보드를 다시 매핑하고 xmodmap을 사용하려는 모든 시도는 기껏해야 일시적이므로 xmodmap은 키 바인딩을 변경하는 오래된 방법인 것 같습니다. I18n 도구는 언제든지 키보드를 다시 매핑하고 xmodmap을 삭제하기 때문입니다. 화면이 잠기거나 잠금 해제되고 사용자 GUI 세션 관리자가 다시 초기화될 때.

관련 정보