sxhkd를 systemd 서비스로 시작할 수 없습니다

sxhkd를 systemd 서비스로 시작할 수 없습니다

저는 Arch Linux 설치에서 bspwm을 사용하고 있으며 애플리케이션을 시작하려면 sxhkd 핫키 데몬을 실행해야 합니다.

지금까지 시작 스크립트는 내 .config/bspwm/bspwmrc(간단한 bash 스크립트 파일)에 있습니다.

# Keyboard bindings manager
pkill sxhkd
sxhkd -m 1&

논쟁 -m 1은 내가 쿼티 키보드를 갖고 있지 않기 때문이다.

자동으로 로그인하면 디스플레이 관리자인 LightDM이 bspwmrc 스크립트를 실행합니다. 여태까지는 그런대로 잘됐다.

독서아치스 위키, 나는 Systemd로 직접 sxhkd를 시작할 수 있다는 것을 깨달았습니다. 심지어협회샘플 서비스 파일에는 다음이 포함됩니다.

[Unit]
Description=Simple X Hotkey Daemon
Documentation=man:sxhkd(1)
BindsTo=display-manager.service
After=display-manager.service

[Service]
ExecStart=/usr/bin/sxhkd
ExecReload=/usr/bin/kill -SIGUSR1 $MAINPID

[Install]
WantedBy=graphical.target

그럼 왜 안되는지 궁금합니다. sxhkd.service 파일을 복사하고 /etc/systemd/system(-m 1 매개변수를 추가한 후), 활성화 서비스를 사용하고 sudo systemctl enable sxhkdbspwmrc 스크립트의 행에 주석을 달고 재부팅합니다.

아아, 이것은 작동하지 않습니다. 을 입력할 때 systemctl status sxhkd다음 오류 메시지가 나타납니다.

Warning: The unit file, source configuration file or drop-ins of sxhkd.service changed on disk. Run 'systemctl daemon-rel>
● sxhkd.service - Simple X Hotkey Daemon
     Loaded: loaded (/etc/systemd/system/sxhkd.service; enabled; vendor preset: disabled)
     Active: failed (Result: exit-code) since Fri 2020-07-24 10:29:05 CEST; 14min ago
       Docs: man:sxhkd(1)
   Main PID: 662 (code=exited, status=1/FAILURE)

Jul 24 10:29:05 Solgaleo systemd[1]: Started Simple X Hotkey Daemon.
Jul 24 10:29:05 Solgaleo sxhkd[662]: Can't open display.
Jul 24 10:29:05 Solgaleo systemd[1]: sxhkd.service: Main process exited, code=exited, status=1/FAILURE
Jul 24 10:29:05 Solgaleo systemd[1]: sxhkd.service: Failed with result 'exit-code'.

제가 이해한 바는 이것이 Can't open displaysxhkd가 너무 일찍 시작되었음을 의미한다는 것입니다. 이 문제를 해결하는 이유와 방법을 모르겠습니다.

이전 구성으로 돌아갈 수 있다는 것을 알고 있지만, Arch Wiki에서 작동하지 않는 것이 있으면 내 잘못인지 아니면 Wiki를 업데이트해야 하는지 알아보고 싶습니다.

편집하다:

추가 조사 결과 sxhkd를 루트로 실행하면 작동하지 않는 것으로 나타났습니다.

이것이 내가 바꾼 것입니다:

/etc/systemd/systemsxhkd.service 파일을 에서 로 이동 /etc/systemd/user하고 명령을 통해 활성화했습니다 systemctl --user enable sxhkd.

여전히 작동하지 않지만 다른 오류 메시지가 나타납니다.

Failed to start sxhkd.service: Unit display-manager.service not found. 

입력하면 systemctl status display-manager다음이 제공됩니다.

● lightdm.service - Light Display Manager
     Loaded: loaded (/usr/lib/systemd/system/lightdm.service; enabled; vendor preset: disabled)
     Active: active (running) since Sat 2020-07-25 11:11:07 CEST; 10min ago
       Docs: man:lightdm(1)
   Main PID: 602 (lightdm)
      Tasks: 4 (limit: 38412)
     Memory: 63.7M
     CGroup: /system.slice/lightdm.service
             ├─602 /usr/bin/lightdm
             └─666 /usr/lib/Xorg -bs -core :0 -seat seat0 -auth /run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch

Jul 25 11:11:05 Solgaleo systemd[1]: Starting Light Display Manager...
Jul 25 11:11:07 Solgaleo lightdm[602]: Error getting user list from org.freedesktop.Accounts: GDBus.Error:org.freedesktop>
Jul 25 11:11:07 Solgaleo systemd[1]: Started Light Display Manager.
Jul 25 11:11:08 Solgaleo lightdm[670]: pam_succeed_if(lightdm-autologin:auth): requirement "user ingroup autologin" was m>
Jul 25 11:11:08 Solgaleo lightdm[670]: Error getting user list from org.freedesktop.Accounts: GDBus.Error:org.freedesktop>
Jul 25 11:11:08 Solgaleo lightdm[670]: pam_unix(lightdm-autologin:session): session opened for user ben by (uid=0)
lines 1-17/17 (END)

이는 디스플레이 관리자가 제대로 작동하고 있음을 의미합니다. 어쩌면 시작된 서비스로는 볼 수 없겠죠 --user?

편집 2:

BindsTo실제로 는 After필요하지 않습니다. 서비스는 사용자로 시작되므로 사용자 세션이 시작된 후입니다. 하지만 제거하면 부팅 시 서비스가 전혀 시작되지 않습니다. 수동으로 시작하면 잘 작동합니다.

편집 3:

제가 수행한 단계에 대한 자세한 내용은 여기에서 확인할 수 있습니다.https://bbs.archlinux.org/viewtopic.php?id=257626&p=2

답변1

당신이 설명하는 접근 방식은 불가능하거나 적어도 내가 아는 한 불가능합니다. 다음 반례를 고려하십시오. 다중 헤드 설정이 있는 경우 두 번 로그인됩니다. systemd핫키 데몬의 복사본을 시작합니다 . 이제 시스템 사용자 두 명 중 한 명이 단축키를 눌렀습니다. 누가 화면에서 결과를 볼 수 있나요? ;)

따라서 가장 좋은 접근 방식은 세션이 핫키 데몬을 시작하도록 하는 것입니다. 쉬운 방법은 이전처럼 창 관리자의 시작 스크립트를 사용하는 것입니다. 보다 현대적인 접근 방식은 일종의 사용자 세션을 통해 관리하도록 하는 것입니다. 이는 실제로 시스템 및 창 관리자 설정에 따라 다릅니다. 내 경험에 따르면 이것은 항상 약간의 실수가 있었고 잘 문서화되지 않았지만 시작 스크립트는 매우 간단합니다.

dbus 서비스 파일을 작성하는 방법의 예는 여기에서 볼 수 있습니다.https://serverfault.com/a/906224/107282. 언급한 데몬에는 dbus가 필요하지 않지만 구성된 변수를 사용하여 적절한 시간에 시작할 수 있도록 해야 합니다 DISPLAY.

관련 정보