Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 09/07/2025, à 19:25

edaone

script bash problème sur le résultat

Bonjour à tous,

j'ai un soucis sur le résulta de mon script bash.

Mon script consiste à faire des pings sur mes site en local et d'envoyer le résultat dans un fichier log.

l'envoir se fait bien sur le fichier ça ce n'est pas le problème.

en revanche c'est le résultat qui est en erreur.

j'ai fait un test simple simple dans une boucle while et le résultat est ok sur le terminal.

mais une fois que je met en place ma condition dans la boucle le ping du 1er site est ok mais pas pour les autres.

le script fonctionnel:

#!/bin/bash
SITE_ARRAY=("www.site1" "www.site2" "www.site3" "www.site4")
for site in "${SITE_ARRAY[@]}"
do
   echo $site
   ping -c 2 $site #> /dev/null
    
#   if [ $? -ne 0 ]
#   then
#   echo "Erreur - le site $site ne répond pas!"
#   PATH="/home/juju/Documents/scripts/cron/touch.txt"
 #  echo $site "Erreur - le site $site ne répond pas!">> $PATH
 #  else
 #  PATH="/home/juju/Documents/scripts/cron/touch.txt"
#   DATE=date
 #  echo "OK - Le site $site fonctionne!"
#   echo $site "OK - Le site $site fonctionne!">> $PATH
#   fi
done

et la suite où le résultat est en erreur.

#!/bin/bash
SITE_ARRAY=("www.site1" "www.site2" "www.site3" "www.site4")
for site in "${SITE_ARRAY[@]}"
do
   echo $site
   ping -c 2 $site #> /dev/null
    
   if [ $? -ne 0 ]
   then
   echo "Erreur - le site $site ne répond pas!"
   PATH="/home/juju/Documents/scripts/cron/touch.txt"
   echo $site "Erreur - le site $site ne répond pas!">> $PATH
   else
   PATH="/home/juju/Documents/scripts/cron/touch.txt"
   DATE=date
   echo "OK - Le site $site fonctionne!"
   echo $site "OK - Le site $site fonctionne!">> $PATH
   fi
done

voici le résultat

www.site1
PING site1 (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.038 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.055 ms
 
--- site1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1033ms
rtt min/avg/max/mdev = 0.038/0.046/0.055/0.008 ms
OK - Le site www.site1 fonctionne!
www.site2
test.sh: ligne 19: ping : commande introuvable
Erreur - le site site2 ne répond pas!
www.site3
test.sh: ligne 19: ping : commande introuvable
Erreur - le site www.site3 ne répond pas!
www.site4
test.sh: ligne 19: ping : commande introuvable
Erreur - le site www.site4 ne répond pas!

donc mon problème je suppose qu'il vient de la condition.
Auriez-vous une idée?

merci


Ubuntu 24.04.2 LTS

Hors ligne

#2 Le 09/07/2025, à 20:08

Watael

Re : script bash problème sur le résultat

salut,

voilà un parfait exemple de pourquoi il ne faut pas écrire les variables utilisateur tout en majuscules !
ta variable PATH écrase la variable système PATH qui contient les chemins vers les exécutables.

#!/bin/bash

logPath='/home/juju/Documents/scripts/cron/touch.txt'
sites=( 'www.site1' 'www.site2' 'www.site3' 'www.site4' )

for site in "${sites[@]}"
do
    echo "$site"

    if ping -c 2 "$site" #> /dev/null
    then
        echo "Erreur - le site $site ne répond pas!"
        echo "$site Erreur - le site $site ne répond pas!" >>"$logPath"
    else
        echo "OK - Le site $site fonctionne!"
        echo "$site OK - Le site $site fonctionne!" >>"$logPath"
    fi
done

Dernière modification par Watael (Le 09/07/2025, à 20:15)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#3 Le 10/07/2025, à 21:41

edaone

Re : script bash problème sur le résultat

Watael a écrit :

salut,

voilà un parfait exemple de pourquoi il ne faut pas écrire les variables utilisateur tout en majuscules !
ta variable PATH écrase la variable système PATH qui contient les chemins vers les exécutables.

#!/bin/bash

logPath='/home/juju/Documents/scripts/cron/touch.txt'
sites=( 'www.site1' 'www.site2' 'www.site3' 'www.site4' )

for site in "${sites[@]}"
do
    echo "$site"

    if ping -c 2 "$site" #> /dev/null
    then
        echo "Erreur - le site $site ne répond pas!"
        echo "$site Erreur - le site $site ne répond pas!" >>"$logPath"
    else
        echo "OK - Le site $site fonctionne!"
        echo "$site OK - Le site $site fonctionne!" >>"$logPath"
    fi
done

salut;
ah oui en effet comme ceci ça fonctionne direct.
Merci encore de te réponse rapide.
Je ne savais pas que ça allais écraser.
Je tenais à le faire car une fois le passage d'ubuntu 22 au 24, apache et mes VHOST ont été pourris. Donc avec ça dès que fais une MAJ je peux vooir si tout est OK.
Je ne savais pas que c'était d'office une variable global.
Je vais essayer de trouver un site qui donne toute les variable global car cela pourrait me servir pour plus tard.

Merci encore.
j'aimerai beaucoup en savoir d'avantage sur les scripts bash.


Ubuntu 24.04.2 LTS

Hors ligne

#4 Le 10/07/2025, à 21:52

Watael

Re : script bash problème sur le résultat

env | grep '^[[:upper:]]\+=' | sort

et la version complète pour bash :

compgen -A variable | grep '^[[:upper:]]\+' | sort

le plus simple (cf. KISS principle), c'est de ne jamais utiliser de noms tout en majuscules pour ses variables; par contre, on peut panacher : nomDeMaVariable, par exemple.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#5 Le 11/07/2025, à 05:00

nany

Re : script bash problème sur le résultat

Bonjour,



Watael a écrit :
env | grep '^[[:upper:]]\+=' | sort

Je ne vois pas l’utilité du grep puisque les variables d’environnement (sauf une) commencent par une lettre capitale.
En plus, ce grep filtre les variables dont le nom contient au moins un underscore, ce qui est dommage.

Watael a écrit :
compgen -A variable | grep '^[[:upper:]]\+' | sort

Là aussi, le grep est discutable car il ne filtre que les quelques variables commençant par un underscore.
Et, chez moi, compgen -A variable génère une liste triée alphabétiquement donc pas besoin du sort.

En ligne

#6 Le 11/07/2025, à 07:11

edaone

Re : script bash problème sur le résultat

Bonjour à tous et merci de vos réponse.

ça va me servir pour mes autres scripts.

J'ai remarqué hier soir quand j'ai testé le code (qui fonctionne) que les résultats sont monté à l'envers il me se semble non?
J'aurais dû mettre:

for site in "${sites[@]}"
do
    echo "$site"

    if ping -c 2 "$site" #> /dev/null
    then
        echo "OK - Le site $site fonctionne!"
        echo "$site OK - Le site $site fonctionne!" >>"$logPath"
    else
        echo "Erreur - le site $site ne répond pas!"
        echo "$site Erreur - le site $site ne répond pas!" >>"$logPath"
    fi
done

Au lieu de faire:

for site in "${sites[@]}"
do
    echo "$site"

    if ping -c 2 "$site" #> /dev/null
    then
        echo "Erreur - le site $site ne répond pas!"
        echo "$site Erreur - le site $site ne répond pas!" >>"$logPath"
    else
        echo "OK - Le site $site fonctionne!"
        echo "$site OK - Le site $site fonctionne!" >>"$logPath"
    fi
done

Ubuntu 24.04.2 LTS

Hors ligne

#7 Le 11/07/2025, à 11:42

Watael

Re : script bash problème sur le résultat

+1 wink


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#8 Le 12/07/2025, à 08:47

iznobe

Re : script bash problème sur le résultat

Bonjour , plutot que de faire :

if ping -c 2 "$site" #> /dev/null
    then
        echo "Erreur - le site $site ne répond pas!"
        echo "$site Erreur - le site $site ne répond pas!" >>"$logPath"
    else
        echo "OK - Le site $site fonctionne!"
        echo "$site OK - Le site $site fonctionne!" >>"$logPath"
    fi

pour economiser quelques lignes et eviter la repetition , tu pourrais simplement faire :

    if ping -c 2 "$site" #> /dev/null
    then
        echo "$site Erreur - le site $site ne répond pas!" | tee -a "$logPath"
    else
        echo "$site OK - Le site $site fonctionne!" | tee -a "$logPath"
    fi

sachant que les ' echo ' sont à l' envers ... :

iznobe@iznobe-pc:~$ site=google.fr
iznobe@iznobe-pc:~$ echo $site
google.fr
iznobe@iznobe-pc:~$ if ping -c 2 "$site" #> /dev/null
    then
        echo "$site Erreur - le site $site ne répond pas!" | tee -a "$logPath"
    else
        echo "$site OK - Le site $site fonctionne!" | tee -a "$logPath"
    fi
PING google.fr (142.250.200.227) 56(84) bytes of data.
64 bytes from mrs08s18-in-f3.1e100.net (142.250.200.227): icmp_seq=1 ttl=116 time=38.6 ms
64 bytes from mrs08s18-in-f3.1e100.net (142.250.200.227): icmp_seq=2 ttl=116 time=16.3 ms

--- google.fr ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 16.250/27.422/38.595/11.172 ms
google.fr Erreur - le site google.fr ne répond pas!
iznobe@iznobe-pc:~$

du coup le " bon " code serait plutot :

    if ping -c 2 "$site"
    then
        echo "$site OK - Le site $site fonctionne!" | tee -a "$logPath"
    else
        echo "$site Erreur - le site $site ne répond pas!" | tee -a "$logPath"
    fi

Dernière modification par iznobe (Le 12/07/2025, à 08:57)


retour COMPLET et utilisable de commande  |  script montage partitions

MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#9 Le 14/07/2025, à 15:26

LeoMajor

Re : script bash problème sur le résultat

ZERO pour tout le monde.
Un service tcp doit être évalué par une commande tcp et certainement pas par ICMP (ping). En aucun cas, un ping garantit que untel service soit accessible et fonctionnel.
Le fil conducteur sur un serveur devrait être le service et pas le serveur en tant que machine. cqfd.

~$ for host in ubuntu-fr.org forum.ubuntu-fr.org; do for port in 80 443 8080 22; do nc -i1 -w1 -z "$host" "$port"; if [ $? -eq 0 ]; then echo "++ service accessible en $host,$port"; else echo "$host,$port, service inaccessible"; fi; done; done
++ service accessible en ubuntu-fr.org,80
++ service accessible en ubuntu-fr.org,443
ubuntu-fr.org,8080, service inaccessible
ubuntu-fr.org,22, service inaccessible
++ service accessible en forum.ubuntu-fr.org,80
++ service accessible en forum.ubuntu-fr.org,443
forum.ubuntu-fr.org,8080, service inaccessible
++ service accessible en forum.ubuntu-fr.org,22

Dernière modification par LeoMajor (Le 14/07/2025, à 15:29)

Hors ligne

#10 Le 14/07/2025, à 15:37

iznobe

Re : script bash problème sur le résultat

Un service tcp doit être évalué par une commande tcp et certainement pas par ICMP (ping). En aucun cas, un ping garantit que untel service soit accessible et fonctionnel.

Mon script consiste à faire des pings sur mes site en local et d'envoyer le résultat dans un fichier log.

Deja , bonjour hein .

si le demandeur veut faire des pings , on améliore son script pour le faire .
Comme il ne dit pas si il veut vérifier qu ' un service est opérationnel ( ou pas ) , on en déduit qu ' il veut vérifier si une machine est en ligne .

ta boule de cristal fonctionne mieux que la mienne peut etre , et encore meme pas sur sans reponse du demandeur ( pour peu qu ' il y ait une question cachée dans ton affirmation ) .


retour COMPLET et utilisable de commande  |  script montage partitions

MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#11 Le 14/07/2025, à 15:58

LeoMajor

Re : script bash problème sur le résultat

non, c'est ZERO et éliminatoire pour moi.

Hors ligne

#12 Le 14/07/2025, à 16:15

iznobe

Re : script bash problème sur le résultat

LeoMajor a écrit :

non, c'est ZERO et éliminatoire pour moi.

lol lol
on est pas dans une interro surprise du lycée là tongue


retour COMPLET et utilisable de commande  |  script montage partitions

MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#13 Le 14/07/2025, à 16:41

Watael

Re : script bash problème sur le résultat

do if nc -i1 -w1 -z "$host" "$port"; then

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne