현재 X 서버를 사용하여 노출된 서비스를 구성하기 위해 systemd 단위 파일을 사용하고 있습니다.
X 서버 인스턴스는 로그인한 사용자(현재 pi
사용자)에 의해 시작되지만 서비스는 루트에서 시작됩니다.
systemctl start test_graphic_app
XAUTHORITY
.Xauthority 파일 위치를 유닛 파일의 변수 에 하드코딩하면 아래와 같이 성공적으로 서비스를 시작할 수 있습니다.
[Unit]
Description=Test Graphic App
After=multi-user.target
[Service]
Type=simple
User=root
Group=root
Environment="DISPLAY=:0"
Environment="XAUTHORITY=/home/pi/.Xauthority"
ExecStart=/usr/bin/python3 /usr/sbin/test_graphic_app.py
KillSignal=SIGINT
SuccessExitStatus=SIGINT
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=test_graphic_app
Restart=on-failure
[Install]
WantedBy=default.target
그러나 다른 사용자로 로그인하거나 랩톱에서 로컬로 실행하면 X를 시작한 사용자가 아니기 때문에 분명히 작동하지 않습니다.pi
시스템에서 .Xauthority 파일 위치를 동적으로 가져오고 싶습니다.
sudo xauth info | grep Authority | awk '{print $3}'
나는 다음과 같이 사용하려고
Environment="XAUTHORITY=$(/usr/bin/xauth info | grep Authority | awk '{print $3}')"
ExecStartPre=/bin/bash -c 'export XAUTHORITY=${XAUTHORITY}'
하지만 내 노트북에서 명령을 실행하면 파이에서는 작동하지 않습니다.
## On laptop ##
$ sudo xauth info | grep "Authority file" | awk '{print $3}'
/run/user/1000/gdm/Xauthority
## On pi ##
$ sudo xauth info | grep "Authority file" | awk '{print $3}'
xauth: file /root/.Xauthority does not exist
/root/.Xauthority
X 서버 인스턴스를 시작한 사용자를 기반으로 .Xauthority 파일 위치를 가져오는 방법을 찾을 수 없습니다. 또한 어떤 사용자도 X 디스플레이를 사용하여 다음 작업을 수행하는 것을 허용하고 싶지 않습니다.xhost +
내 시스템 장치 내에서 위치를 어떻게 알 수 있나요?
.Xauthority 위치를 찾는 것 외에 더 나은 솔루션이 있습니까?
답변1
허용된 연결 목록에 로컬 사용자 루트만 추가하는 xhost +
더 복잡한 버전이 있습니다 .xhost +si:localuser:root
배포판에 따라 로그인 시 실행되도록 이 명령을 넣을 위치를 찾아야 합니다. /etc/X11/
기존 파일을 찾으려면 "이미"를 사용하세요 xhost
. 내 파이에서 나는 이것을 발견했습니다 /etc/X11/Xsession.d/35x11-common_xhost-local
:
if type xhost >/dev/null 2>&1; then
xhost +si:localuser:$(id -un) || :
fi
다른 시스템에서는 에 있습니다 /etc/X11/xinit/xinitrc.d/localuser.sh
.
답변2
설치 스크립트에 다음을 추가하세요.
sudo mkdir /opt/xauthorityfix
sudo chmod 777 /opt/xauthorityfix
echo "#!/bin/sh" > /opt/xauthorityfix/setxauthority.sh
echo "export XAUTHORITY=$XAUTHORITY" >> /opt/xauthorityfix/setxauthority.sh
sudo chmod 755 /opt/xauthorityfix
그런 다음 Python 스크립트를 이 셸 스크립트로 래핑합니다.
#!/bin/sh
source /opt/xauthorityfix/setxauthority.sh
/usr/bin/python3 /usr/sbin/test_graphic_app.py
시스템 서비스에 스크립트를 시작하도록 요청하세요!
설치 스크립트를 실행할 때 XAUTHORITY 환경 변수를 설정했는지 확인하세요. sudo나 sudo -E
.
기본적으로 설치 스크립트를 실행할 때 XAUTHORITY 환경 변수를 저장하므로 나중에 쉽게 참조할 수 있습니다.