systemd 서비스 파일에 DISPLAY 설정

systemd 서비스 파일에 DISPLAY 설정

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

이것은 나에게 효과적입니다!

관련 정보