Сценарий Python, запущенный с помощью systemd, не может запустить gedit - PullRequest
0 голосов
/ 10 марта 2019

У меня есть следующий скрипт Python в /home/jack/Code/Service/main.py:

from subprocess import Popen

Popen(["/usr/bin/gedit"])

while True:
    pass

Я запускаю его с помощью этой службы systemd:

[Unit]
Description=Test

[Service]
Type=simple
Restart=no
User=jack
WorkingDirectory=/home/jack/Code/Service
ExecStart=/usr/bin/python3 main.py

[Install]
WantedBy=multi-user.target

Когда я запускаю main.py из командыстрока с python3 main.py, она запускается и Gedit открывается.Когда я запускаю службу systemd и просматриваю журналы, я вижу:

mars 10 11:19:55 Ubuntu-Tower systemd[1]: Started Test.
mars 10 11:19:55 Ubuntu-Tower python3[8827]: Unable to init server: Could not connect: Connection refused
mars 10 11:19:55 Ubuntu-Tower gedit[8835]: cannot open display: 

Обратите внимание, что процесс gedit действительно отображается в системном мониторе при запуске службы (и исчезает только после остановкисервис), так что это действительно похоже на проблему с графическим интерфейсом.

Что происходит и как я могу получить желаемое поведение?

1 Ответ

1 голос
/ 10 марта 2019

Чтобы открыть окно в X11, системе Windows Linux и других, вы должны указать отображение.Обычно это определяется в переменной окружения DISPLAY.В моем случае он установлен на «: 0.0».Если эта переменная не установлена, программа не знает, где рисовать окно:

marco$ DISPLAY= xeyes
Error: Can't open display:
marco$

В некоторых программах можно указать отображение с помощью параметра -display.Одной этой информации недостаточно: X11 включает в себя список контроля доступа разрешенных клиентов, которые могут подключаться к определенному серверу.

marco$ su - test
Password:
test$ env | grep DISPLAY
DISPLAY=:0.0
test$ xeyes
No protocol specified
Error: Can't open display: :0.0

xhost - это инструмент для управления acl:

marco$ xhost +
access control disabled, clients can connect from any host
marco$ su - test
Password:
# disable X11 acl with xhost +
test:~$ xeyes
^C

В любом случае помните, что сервер X11 должен работать, чтобы иметь возможность открывать окна, и вы можете столкнуться с другими видами ошибок, если сервер не прослушивает при запуске службы (Невозможно инициализировать сервер: Не удалось подключиться:Соединение отказано)

...