2017-02-13 8 views
0

nennen würde Ich mag ein Skript als systemd Dienst auszuführen, die systemd Dienst kann nicht i3 --get-socketpath

i3 --get-socketpath 
fordert jedoch sein Rückkehrcode ist immer 1, wenn ich es als systemd Dienst ausgeführt wird, obwohl es funktioniert (Rückgabecode ist 0), wenn ich den Befehl ExecStart manuell in meinem Terminal ausführen.

/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()) 

Warum funktioniert der Dienst nicht anrufen i3 --get-socketpath? Wie man es repariert?

+1

Wahrscheinlich ist dies, weil der systemd Dienst nicht im gleichen Umfang wie die X-Sitzung, was zu der Umgebungsvariable 'DISPLAY' nicht gestartet wird definiert. Versuchen Sie, das Schlüsselwortargument 'env = dict (os.environ, DISPLAY =": 0 ")' zum Aufruf 'Popen()' hinzuzufügen. Offensichtlich benötigt dies "Import os" und nimmt an, dass "DISPLAY" tatsächlich ": 0" innerhalb der laufenden X-Sitzung ist. – Adaephon

+0

Danke, das funktioniert. Allerdings habe ich nicht erwähnt, dass ich tatsächlich ein Python-Skript ausführen möchte, das [i3ipc] (https://github.com/acrisci/i3ipc-python) verwendet, das den Aufruf intern durchführt, ohne das Schlüsselwortargument hinzuzufügen. Gibt es eine alternative Lösung? – maiermic

Antwort

0

Dank Adaephon

Der systemd Dienst wird im gleichen Umfang wie die X-Sitzung, was zu der Umgebungsvariable DISPLAY nicht definiert wird nicht gestartet.

, die in der Service-Konfiguration eingestellt werden können

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

[Install] 
WantedBy=multi-user.target