2017-02-13 5 views
0

Je voudrais lancer un script comme un service systemd qui appellele service systemd ne peut pas appeler i3 --get-socketpath

i3 --get-socketpath 

Cependant, son code de retour est toujours 1 si je lance comme un service systemd, même si cela fonctionne (le code de retour est 0) si j'exécute la commande ExecStart manuellement dans mon terminal.

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

Pourquoi le service ne ne pas appeler i3 --get-socketpath? Comment le réparer?

+1

plus probable que ce soit parce que le service systemd ne démarre pas dans la même portée que la session X, conduisant à la variable d'environnement 'display' ne pas être défini. Essayez d'ajouter l'argument mot-clé 'env = dict (os.environ, DISPLAY =": 0 ")' à l'appel 'Popen()'. Évidemment, cela nécessite 'import os' et suppose que' DISPLAY' est '' 0 '' dans la session X en cours d'exécution. – Adaephon

+0

Merci, ça fonctionne. Cependant, je n'ai pas mentionné que j'aime réellement exécuter un script python qui utilise [i3ipc] (https://github.com/acrisci/i3ipc-python), qui effectue l'appel en interne sans ajouter l'argument mot-clé. Y a-t-il une solution alternative? – maiermic

Répondre

0

Merci à Adaephon

Le service systemd ne démarre pas dans la même portée que la session X, conduisant à la variable d'environnement DISPLAY pas défini.

qui peut être réglé dans la configuration du service

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

[Install] 
WantedBy=multi-user.target