Я хотел бы, чтобы запустить сценарий как Systemd службы, который вызываетSystemd служба не может назвать i3 --get-socketpath
i3 --get-socketpath
Однако его код возврата всегда 1, если я запускаю его как Systemd службы, даже если он работает (код возврата равен 0), если я запускаю команду ExecStart
вручную в моем терминале.
/etc/systemd/system/my-script.service
[Service]
Type=simple
ExecStart=/usr/bin/python3 /home/my-username/my-script.py
User=my-username
[Install]
WantedBy=multi-user.target
/home/my-username/my-script.py
import subprocess
process = subprocess.Popen(['i3', '--get-socketpath'],
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
returncode = process.wait()
print('return code: {0}'.format(returncode))
print(process.stdout.read())
Почему сервис не удается позвонить i3 --get-socketpath
? Как это исправить?
Скорее всего, это происходит потому, что Systemd служба не запущена в тех же пределах, что и X сессии, что приводит к переменной окружения 'не display' быть определены. Попробуйте добавить аргумент ключевого слова 'env = dict (os.environ, DISPLAY =": 0 ")' в вызов 'Popen()'. Очевидно, что для этого требуется 'import os' и предполагает, что' DISPLAY' фактически является ': 0' в рамках текущего сеанса X. – Adaephon
спасибо, что работает. Однако я не упомянул, что мне действительно нравится запускать скрипт python, который использует [i3ipc] (https://github.com/acrisci/i3ipc-python), который выполняет внутренний вызов без добавления аргумента ключевого слова. Есть ли альтернативное решение? – maiermic