Systemd pour python-pygame

Et oui, init.d c’est fini, mort et enterré. Place à systemd désormais.

Donc pour lancer le joli petit pi-radio qui n’est rien d’autre qu’un petit script en python de façon automatique il m’en fallait un.

pi-radio.service

Comme j’ai un peu souffert pour le faire fonctionner correctement il est judicieux de vous le filer (il est dans le repo) mais surtout de l’expliquer.

[Unit]
Description=Launch Pi Radio
Wants=network-online.target
After=network-online.target

[Service]
Environment=MPD_HOST=192.168.0.XX
ExecStart=/usr/bin/python -u radioplayer.py

[Install]
WantedBy=multi-user.target

Explications

Je vous ferai grâce d’une explication ligne par ligne mais vous indiquerais plutôt pourquoi telle ou telle valeur.

  • Wants & After: sans réseau il ne fonctionnera pas vu que mon mpd est sur une autre machine.
  • Environment: spécifie une adresse différente pour la connexion sur mpd (par défault il se connecte sur localhost: cfr la doc de MPC pr en savoir plus)
  • ExecStart: le switch -u est utilisé et CAPITAL pour débugguer à travers systemd. Visiblement python par défault bufferise le stdout & stderr et cela nous prive des détails à travers le journalctl lors du débugguage
  • WorkingDir: Le script en l’état n’a visiblement pas conscience d’où il se trouve et si on le lance en l’état il ne retrouve pas ses fichiers images. Il faut donc le forcer à se lancer depuis un working directory donné le hash 64d08ee permet dorénavant de se passer du working directory

Mise en place

Pour l’installation je vous fais grâce de tout les détails mais dans les grandes lignes ça donne:

  • copier le fichier ci dessus dans /etc/systemd/system/pi-radio.service
  • systemctl enable pi-radio.service
  • systemctl start pi-radio.service

Systemd et SIGHUP

Autre chose importante à savoir pour le lancement d’une app python à travers systemd. Ce dernier envoie un sighup à l’application pour lui signifier qu’il va se détacher et laisser python vivre seul. Sauf que visiblement un script python de base le prend très mal et se plante.

Il faut donc catcher ce signal au niveau du script:

import signal

def dont_quit(signal, frame):
	print 'Catch signal: {}'.format(signal)

signal.signal(signal.SIGHUP, dont_quit)

N’oubliez pas de catcher les autres signaux afin de fermer proprement l’application.

Posted in Vidéo & Audio by El Gnap at February 6th, 2016.
Tags: , , , , , ,

Comments are closed.