Le releve part d'une entree crontab, pas d'un service utilisateur

Le linger systemd aurait fait demarrer une douzaine de services
graphiques sans session ouverte - gnome-remote-desktop et le trousseau
compris. Le proprietaire a tranche pour une entree @reboot qui ne
relance que ce releve.

Consequence technique : on ne peut pas passer par systemctl --user,
qui echouerait faute de gestionnaire de services au demarrage. Le
script fait donc lui-meme le travail d'un superviseur : garde
anti-doublon - deux processus sur le meme port entrelacent leurs
lectures et produisent des relevés faux sans que rien ne le signale -
attente si le port n'est pas encore la, redemarrage apres echec, et
journal tronque au-dela de cinq megaoctets.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KKzkkVTG6KXnGXFFC7X9XJ
This commit is contained in:
Tallagrand Thierry
2026-09-05 20:40:40 +02:00
parent f205ff2707
commit a9047d1391
3 changed files with 57 additions and 0 deletions

View File

@@ -0,0 +1,47 @@
#!/bin/bash
# Lance et surveille le releve continu des cellules Pylontech.
#
# Appele par une entree @reboot de la crontab utilisateur. On ne passe PAS par
# `systemctl --user` : sans « linger », aucun gestionnaire de services
# utilisateur ne tourne au demarrage, et la commande echouerait faute de
# XDG_RUNTIME_DIR. Le choix a ete fait de ne pas activer le linger, qui aurait
# aussi fait demarrer une douzaine de services graphiques sans session ouverte.
#
# Ce script fait donc lui-meme le travail d'un superviseur : garde
# anti-doublon, redemarrage apres echec, journal borne.
DEPOT=/mnt/projects/EVCS/EVCS
PORT=/dev/ttyUSB0
JOURNAL="$HOME/.local/state/releve-cellules.log"
MODULES=1,2,3,4
PAS=600
mkdir -p "$(dirname "$JOURNAL")"
# Garde anti-doublon : deux processus sur le meme port serie entrelacent leurs
# lectures et produisent des relevés faux, sans que rien ne le signale.
if pgrep -f "pylontech-console.mjs --port $PORT" >/dev/null; then
echo "$(date '+%F %T') deja en cours, on ne relance pas" >> "$JOURNAL"
exit 0
fi
cd "$DEPOT" || { echo "$(date '+%F %T') depot introuvable" >> "$JOURNAL"; exit 1; }
while true; do
# Le journal est tronque au-dela de 5 Mo : une semaine sans surveillance ne
# doit pas remplir la partition.
[ -f "$JOURNAL" ] && [ "$(stat -c%s "$JOURNAL")" -gt 5242880 ] && : > "$JOURNAL"
if [ ! -e "$PORT" ]; then
echo "$(date '+%F %T') $PORT absent, nouvelle tentative dans 60 s" >> "$JOURNAL"
sleep 60
continue
fi
echo "$(date '+%F %T') demarrage du releve" >> "$JOURNAL"
/usr/bin/node tools/pylontech-console.mjs \
--port "$PORT" --suivi "$PAS" --modules "$MODULES" >> "$JOURNAL" 2>&1
echo "$(date '+%F %T') arret (code $?), reprise dans 60 s" >> "$JOURNAL"
sleep 60
done