У меня есть служба, которая может захватывать экран конкретного пользователя, используя API-интерфейсы java.awt.Robot, при запуске от имени пользователя root (как и несколько других вещей, чем захват экрана пользователя).
Окружающая среда для инициализации java.awt.Robot установлен в служебном файле /lib/systemd/system/screencap.service с использованием переменных среды - $XAUTHORITY и $DISPLAY конкретного пользователя.
[Unit]
Description=My Screen Capture Service (running as root)
After=syslog.target
After=network.target
[Service]
Environment="XAUTHORITY=/home/myuser/.Xauthority" "DISPLAY=:0"
WorkingDirectory=/usr/share/java/screencap
ExecStart=/usr/bin/java -jar /usr/share/java/screencap/screencap.jar
SuccessExitStatus=143
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=screencap
PrivateTmp=true
Restart=on-failure
[Install]
WantedBy=multi-user.target
WantedBy=graphical.target
Он работает для всех дистрибутивов, кроме Ubuntu 17.10, потому что он использует wayland вместо x11.
Когда я выполняю java -jar /usr/share/java/screencap/screencap.jar из пользовательского терминала, new Robot() может найти контекст GUI на Ubuntu 17.10 и работает отлично.
Я не знаю, что должно быть значением Environment="XAUTHORITY=/home/myuser/.Xauthority" "DISPLAY=:0" для Ubuntu 17.10. Это не может быть XAUTHORITY=, потому что $XAUTHORITY не определено в Ubuntu 17.10. Он работает для всех дистрибутивов, кроме Ubuntu 17.10, потому что он использует wayland вместо x11.
Я уже пробовал Environment="XDG_SESSION_TYPE=wayland" "DISPLAY=:0" и Environment="WAYLAND_DISPLAY=wayland-0" "DISPLAY=:0", но ни один из них не работает.
EDIT: я не могу заставить своих пользователей переключиться на X11 / XORG. Я хочу, чтобы моя служба работала на пути.