Bash script problème

Bonsoir à tous,

Contexte:

Je me suis fait un petit script bash pour stoper le docker de HA, exécuter une série d’actions et restart le docker. Tout marche bien tant que je n’ai pas d’écho après le stop du docker…

Script:

Voici déjà un script ultra édulcoré qui m’a permis de cibler l’erreur

#!/bin/bash
#
#==================================================
_date=$(date +"%Y-%m-%d_%H-%M-%S") 
_folder="share/"
_supervisorPath="/mnt/data/supervisor/"
_destFolder="${_supervisorPath}${_folder}/"
_haContainerName="homeassistant"

#file src
_srcFile="${_destFolder}DEV_clone_src.txt"
#file dest 1
_destFileA="${_destFolder}DEV_clone_${_date}_1.txt"
# file dest 2
_destFileB="${_destFolder}DEV_clone_${_date}_2.txt"
##tmp log
_logFile="_log.log"

{
#==================================================
clear
#recup et verif container ID
container="docker ps --no-trunc -aqf name=${_haContainerName}"
_id=$($container 2>/dev/null)

echo ">> Start <<"

# clone 1
cp ${_srcFile}  ${_destFileA}
echo ">> 1st file copied <<"
sleep 2

#stop HA DOCKER
docker stop ${_id}
#echo " >> docker stopped <<"
sleep 10

# clone 2
cp ${_srcFile}  ${_destFileB}
#echo ">> 2nd file copied <<"
sleep 3

# restart HA
docker start ${_id}
#echo ">> docker restarting <<"

} 2>&1 | tee -a ${_destFolder}${_logFile}

Constat:

Si je commente tous les echo, tout marche à merveille. Je décommente en partant du haut au fur et à mesure, tout continu de marcher …Mais à partir du moment ou je décommente un echo après le stop du docker, le script s’arrête à cet emplacement sans restart du docker.
(Et même constat si je fais des echo live en désactivant la sortie dans le log.

Au secour:

Une idée du pourquoi du comment ?

Par avance merci pour les pistes :wink:

Salut,

Essaye un truc con : vire les >> et les << ça correspond aux redirections de fichiers en shell…

Pourquoi ne pas faire un appel à l’API d’HA pour invoquer hassio.host_shutdown ? Si tu demandes à docker de couper HA, docker coupe HA ! Si tu demandes à HA de couper HA, il va finir ce qu’il a à faire et stopper proprement.

Et tu peux même appeler l’API HA depuis python: Client Challenge

Bonsoir, merci pour l’idée, masi malheureusement apres tests pas de différence sans :cry:

Bonsoir,

Pourquoi ne pas faire un appel à l’API d’HA pour invoquer hassio.host_shutdown ?

Je ne souhaite pas juste éteindre HA, le script est bien plus dense; il vient couper HA, modifier les config docker et relancer une fois la config pérenniser. (ajout de point de montage persistant principalement)

Si tu demandes à docker de couper HA, docker coupe HA !

Heu oui, c’est bien l’action attendu, mais comme le script à des opérations à faire en dehors de HA (au niveau system) HA ne peut pas s’en charger d’où l’objectif de la passer en ssh.

Et tu peux même appeler l’API HA depuis python

Même problème, j’adore les scripts python dans HA, mais c’est juste bon pour faire des choses dans le docker de HA pas au niveau sup.

Mais dans l’absolue pas trop de problème de ce côté là, tout marche très bien et cela m’évite des manip fastidieuses à la main en ssh… Le seul truc c’est que je voudrait pouvoir logger ds un fichier le résultat de mes actions pour un éventuel control ou débogage.
Et c’est juste cela que je n’arrive pas à faire ecrire dans mon log apres la coupure du docker alors que j’arrive à copier le fichier sur le disque.

Juste pour clarifier la chose …

Quand tu fais un docker stop ou docker restart, HA est proprement arrêté.
Si tu mets un trigger sur l’arrêt de HA, celui-ci est bien déclenché.

Par contre, si tu fais un docker killalors HA ne s’arrête pas proprement.

2 « J'aime »

Pourquoi tu cherches à récupérer un ID alors que tu peux facilement stop / start un container depuis son nom ?

Hello,

Pourquoi tu cherches à récupérer un ID alors…

Je ne le savais pas au début du script, mais comme ça marche je l’ai gardé, mais oui tu as raison; c’est d’ailleurs ce que je fais qd je dois le faire à la main :roll_eyes:

Du coup toujours pas d’idée pour le stop d’exécution sur les echo ?

existe t-il en bash un moyen simple de loger une action ds un fichier sans echo ?

Salut,

peut-être un :
bash -x TonScript.bash ?

man bash:
-x Afficher les commandes et leurs arguments à mesure qu’elles
sont exécutées.

A+

Bonne idée mais malheureusement le script fonctionne très bien lorsque je l’execute dans un terminal avec des sorties OK. C’est uniquement executer sans terminal qu’il plante.

Bon j’ai trouver une solution, mais je ne sais pas pourquoi elle marche … alors si quelqu’un le sais je suis preneur pour apprendre…

je me suis collé une fonction en début de script

...
_log() {
    local msg="$1"
    local ts=$(date +"%Y-%m-%d %H:%M:%S")
    echo "[${ts}] : ${msg}" >> ${_destFolder}${_logFile}
    printf "[${ts}] : ${msg}\n" >> ${_destFolder}${_logFile}	
}
...

et du coup je relance le echo par la fonction

_log "DEV Test"

Et la tout marche … Le printf est juste la pour tester si la commande echo était le problème mais nom le printf dans le script rencontre la même erreur…

1 « J'aime »

Salut :wave:t2:
Pour moi le soucis était le bloc de code que tu as mis dans des { … } pour n’avoir qu’une seule commande tee…

Salut,

… { … } pour n’avoir qu’une seule commande tee…

Bonne idée, mais j’ai aussi testé sans et cela ne vient pas de la non plus, d’ailleurs, maintenant cela fonctionne très bien en gardant cette structure et en sortant juste les « echo » dans une fonction. A mon avis on est plus proche du bug que d’autre chose … je ne vois pas…

Pour info le script opérationnel :

#!/bin/bash
#
#==================================================
_date=$(date +"%Y-%m-%d_%H-%M-%S") 
_folder="share/"
_supervisorPath="/mnt/data/supervisor/"
_destFolder="${_supervisorPath}${_folder}/"
_haContainerName="homeassistant"

#file src
_srcFile="${_destFolder}DEV_clone_src.txt"
#file dest 1
_destFileA="${_destFolder}DEV_clone_${_date}_1.txt"
# file dest 2
_destFileB="${_destFolder}DEV_clone_${_date}_2.txt"
##tmp log
_logFile="_log.log"

_log() {
    local msg="$1"
    local ts=$(date +"%Y-%m-%d %H:%M:%S")
    echo "[${ts}] : ${msg}" >> ${_destFolder}${_logFile}	
}

clear

{
#==================================================

#recup et verif container ID
container="docker ps --no-trunc -aqf name=${_haContainerName}"
_id=$($container 2>/dev/null)

_log ">> Start <<"

# clone 1
cp ${_srcFile}  ${_destFileA}
_log">> 1st file copied <<"
sleep 2

#stop HA DOCKER
docker stop ${_id}
_log " >> docker stopped <<"
sleep 10

# clone 2
cp ${_srcFile}  ${_destFileB}
_log ">> 2nd file copied <<"
sleep 3

# restart HA
docker start ${_id}
_log ">> docker restarting <<"

} 2>&1 | tee -a ${_destFolder}${_logFile}
1 « J'aime »

Petite réflexion : ton script original fonctionnerait il correctement si tu utilisais des printf à la place des écho ? (Et donc sans passer par la fonction _log ) ?

Bonsoir,

Tenté également par acquis de conscience, mais même résultat malheureusement …

En tous cas merci de proposer !
Très bonne soirée :wink:

1 « J'aime »

Ha ! Ça se complique un peu pour le déboggage .
Perso j’aime bien quand les scripts fonctionnent tels que je les ai écrit … ça me chiffonne de pas réussi :crazy_face: