veilleur-systemd.py
Une LED en battement + un contrôle de services toutes les secondes : le script devient un démon systemd avec Restart=always, démarré au boot. Le patron de robustesse pour une carte embarquée sans écran ni clavier.
Matériel requis
Un Lichee RV Dock (Sipeed, Allwinner D1 RISC-V 1 Go) avec connecteur 40 broches et Ethernet, sous Debian/Milk-V ou image Lichee. Optionnel : LED sur une des LED pilotables du noyau (leds sysfs) ou LED GPIO via gpiozero.
Câblage
Aucun câblage obligatoire ; les LED système sont exposées dans /sys/class/leds et clignotables en écriture simple.
Fonctionnement
Le script boucle à 1 Hz : il bascule la luminosité sysfs et relance tout service déclaré inactif. L'unité systemd (simple, Restart=always) le redémarre s'il meurt et le lance au boot.
Exécution
Sous l’image du dock : installer gpiod et python3-gpiod si absents ; gpiodetect/gpioinfo pour mapper le connecteur (le D1 est RISC-V, les outils restent les memes), puis lancer le script.
Variantes
Ajouter un watchdog matériel (systemd WatchdogSec + sd_notify), ou remonter l'état vers un serveur MQTT (pip install paho-mqtt).
veilleur-systemd.py
#!/usr/bin/env python3
# Veilleur : fait clignoter une LED "battement de coeur" et relance
# les services declares dans VEILLE. A installer en service systemd.
import subprocess
import time
from pathlib import Path
# --- config ---
LED_GLOB = "/sys/class/leds/*"
VEILLE = ["ssh", "cron"] # services a maintenir en vie
def trouver_led():
for led in sorted(Path(LED_GLOB).glob("*")):
if (led / "brightness").exists():
return led / "brightness"
return None
def maintenir():
for service in VEILLE:
r = subprocess.run(["systemctl", "is-active", "--quiet", service])
if r.returncode != 0:
print(f"{service} inactif -> redemarrage")
subprocess.run(["systemctl", "restart", service])
led = trouver_led()
print("Veilleur demarre (LED:", led, ")")
while True:
if led:
led.write_text("1" if (int(time.time()) % 2) else "0")
maintenir()
time.sleep(1)
# Installation (en root) :
# cp veilleur-systemd.py /usr/local/bin/veilleur.py && chmod +x ...
# puis unite systemd de type simple avec Restart=always (voir doc).