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?
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
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