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:
47
deploy/releve-cellules/lancer.sh
Executable file
47
deploy/releve-cellules/lancer.sh
Executable 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
|
||||
Reference in New Issue
Block a user