xclock을 서비스로 시작하여 시스템 서비스를 배우려고 합니다. 서비스 파일은 다음과 같습니다.
[Unit]
Description=clock
[Service]
Environment=DISPLAY=:0
ExecStart=/usr/bin/xclock
[Install]
WantedBy=graphical.target
여기서 무슨 일이 일어나고 있는지 아이디어가 있습니까? "모니터에 연결할 수 없습니다"라는 오류 메시지가 나타납니다.
답변1
응용 프로그램이 X 모니터에서 창을 열려면 두 가지가 필요합니다. X 모니터의 위치를 알아야 하며 이는 DISPLAY
환경 변수를 통해 전달됩니다. 또한 X 서버에 대한 인증이 필요합니다. 이는 X 서버가 시작될 때 생성되는 비밀값인 쿠키를 통해 전달되며, X 서버를 시작한 사용자만 접근할 수 있는 파일에 저장됩니다. 기본 쿠키 파일은 ~/.Xauthority
.
X 서버가 기본 쿠키 파일 위치를 사용하는 경우 ( X에서 로그인한 사용자의 홈 디렉토리라고 가정) 추가 Environment=XAUTHORITY=/home/dogs/.Xauthority
가 작동합니다 . /home/dogs
위치를 찾으려면 다음을 참조하세요.다른 사용자의 데스크탑에서 루트로 그래픽 프로그램을 시작할 수 있습니까?그리고원격 X 모니터에서 창 열기("모니터를 열 수 없습니다" 이유)?
또는 쿠키 파일이 기본 위치에 있는 경우 X 서버를 실행하는 사용자로 프로그램을 실행하면 작동합니다(그렇지 않은 경우 루트 사례에서와 같이 쿠키 파일을 찾아야 합니다). 지시어를 추가합니다 User
(예 User=dogs
: ).
물론, 지정한 사용자가 소유한 번호에 X가 표시되지 않으면 서비스가 실행되지 않습니다.
Systemd에서 GUI 프로그램을 시작하는 것은 다소 이상합니다. 이를 위해 설계되지 않았습니다. GUI 프로그램은 사용자가 시작한 X 세션 내에 존재합니다. Systemd는 시스템 프로세스용입니다. 데몬을 사용해 보아야 합니다.
답변2
현대적인 접근 방식(2021)은 단위 파일에 환경을 하드코딩하지 않습니다 .service
. 대신 다음과 같이 하십시오:
$ cat /etc/X11/xinit/xinitrc.d/50-systemd-user.sh
#!/bin/sh
systemctl --user import-environment DISPLAY XAUTHORITY
if command -v dbus-update-activation-environment >/dev/null 2>&1; then
dbus-update-activation-environment DISPLAY XAUTHORITY
fi
예를 들어 아치 리눅스(Arch Linux)가 이런 일을 합니다.
참고: X11을 시작할 때 DISPLAY
환경 XAUTHORITY
변수가 상속됩니다 .모두systemd 사용자 서비스 단위 파일(즉, systemd에서 관리하는 파일 systemd --user
)
를 실행하여 이러한 설정이 올바른지 확인할 수 있습니다 systemctl --user show-environment
.
Environment=
이렇게 하면 파일에서 지시어를 사용할 필요가 없습니다 .service
.
답변3
다음을 추가할 수 있습니다 .xinitrc
.
xhost si:localuser:$USER
이것은 나에게 효과적입니다!