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
48 lines
1.7 KiB
Bash
Executable File
48 lines
1.7 KiB
Bash
Executable File
#!/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
|