2017-02-13 30 views
0

Я хотел бы, чтобы запустить сценарий как 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? Как это исправить?

+1

Скорее всего, это происходит потому, что Systemd служба не запущена в тех же пределах, что и X сессии, что приводит к переменной окружения 'не display' быть определены. Попробуйте добавить аргумент ключевого слова 'env = dict (os.environ, DISPLAY =": 0 ")' в вызов 'Popen()'. Очевидно, что для этого требуется 'import os' и предполагает, что' DISPLAY' фактически является ': 0' в рамках текущего сеанса X. – Adaephon

+0

спасибо, что работает. Однако я не упомянул, что мне действительно нравится запускать скрипт python, который использует [i3ipc] (https://github.com/acrisci/i3ipc-python), который выполняет внутренний вызов без добавления аргумента ключевого слова. Есть ли альтернативное решение? – maiermic

ответ

0

Благодаря Adaephon

Systemd службы не запускается в том же объеме, что и X сессии, что приводит к переменной среды DISPLAY не определены.

, которые могут быть установлены в конфигурации службы

[Service] 
Type=simple 
Environment=DISPLAY=:0 
ExecStart=/usr/bin/python3 /home/maiermic/tmp/systemd-test.py 
User=maiermic 

[Install] 
WantedBy=multi-user.target