現在、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}'
しかし、私のラップトップでコマンドを実行すると、Pyでは動作しません。
## 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環境変数が保存されるため、後で簡単に参照できます。