Script Bash Test de connection + petite erreur

Salut
Voila je ne savais pas quoi faire dont j’ai codé ! :007

Le script

#!/bin/bash echo "" >> NetStat.log date +"%m-%d-%Y-%T" >> NetStat.log ping -c 3 -i 2 testdebit.info >> NetStat.log iperf -c iperf.testdebit.info -i 2 -t 20 -r >> NetStat.log wget http://1.testdebit.info/fichiers/1Mo.dat -O /dev/null 2>&1 | tail -2 >> NetStat.log

L’output

05-26-2015-15:01:28
PING testdebit.info (46.227.16.8) 56(84) bytes of data.
64 bytes from lafibre.info (46.227.16.8): icmp_seq=1 ttl=54 time=327 ms
64 bytes from lafibre.info (46.227.16.8): icmp_seq=2 ttl=54 time=350 ms
64 bytes from lafibre.info (46.227.16.8): icmp_seq=3 ttl=54 time=387 ms

--- testdebit.info ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 4002ms
rtt min/avg/max/mdev = 327.449/355.059/387.313/24.659 ms
------------------------------------------------------------
Client connecting to iperf.testdebit.info, TCP port 5001
TCP window size: 45.0 KByte (default)
------------------------------------------------------------
[  4] local 10.255.255.104 port 53275 connected with 89.84.127.54 port 5001
[ ID] Interval       Transfer     Bandwidth
[  4]  0.0- 2.0 sec   256 KBytes  1.05 Mbits/sec
[  4]  2.0- 4.0 sec   384 KBytes  1.57 Mbits/sec
[  4]  4.0- 6.0 sec   896 KBytes  3.67 Mbits/sec
[  4]  6.0- 8.0 sec  1.25 MBytes  5.24 Mbits/sec
[  4]  8.0-10.0 sec  1.75 MBytes  7.34 Mbits/sec
[  4] 10.0-12.0 sec  1.88 MBytes  7.86 Mbits/sec
[  4] 12.0-14.0 sec  2.75 MBytes  11.5 Mbits/sec
[  4] 14.0-16.0 sec  1.75 MBytes  7.34 Mbits/sec
[  4] 16.0-18.0 sec  1.75 MBytes  7.34 Mbits/sec
[  4] 18.0-20.0 sec  1.62 MBytes  6.82 Mbits/sec
[  4]  0.0-20.2 sec  14.4 MBytes  5.97 Mbits/sec
2015-05-26 15:04:55 (54,1 KB/s) — « /dev/null » sauvegardé [10000000/10000000]

Cependant, J’ai une erreure lors de l’execution :

machin@truc/home/user# ./NetStat.sh bind failed: Address already in use

Si vous avez des idées/optimisation ou conseil (“C’est de la merde ske tu fait !”)
ps:Premier scripte en Bash que je fais , soyez cool :stuck_out_tongue:

Correction de ton code :

#!/bin/bash
touch NetStat.log
{
    date +"%m-%d-%Y-%T"
    ping -c 3 -i 2 testdebit.info
    iperf -c iperf.testdebit.info -i 2 -t 20 -r
    wget http://1.testdebit.info/fichiers/1Mo.dat -O /dev/null 2>&1 | tail -2
} >> NetStat.log

Cette page explique succinctement pourquoi il est mieux de l’écrire ainsi! :wink:

Ah, oui, au fait … si tu décides de le publier aux autres, il ne te faut pas oublier de mentionner l’installation de l’outil iperf qui n’est généralement pas installé par défaut !

Un exemple de test de dépendances tel que je les implémente dans mes scripts, celui-ci interrompt le script avec un message si l’une des commandes [mono]innoextract[/mono] ou [mono]fakeroot[/mono] est introuvable dans le $PATH de l’utilisateur :

# Contrôle des dépendances for dep in innoextract fakeroot; do if [ -z $(which $dep) ]; then echo "$dep est introuvable." echo "Installez-le avant de lancer ce script." exit 1 fi done
À ajouter bien sûr en début de script, avant invocation de ces commandes.

Bien vu, vv222.

Même si, dans ce cas, j’aurais fait :

iperf="$(which iperf)"

if [[ -n ${iperf} ]]; then ... fi

Ton exemple est intéressant, mais pareil, je préfère mettre les différentes commandes dans un tuple, puis appeler le tuple comme dans ta boucle, tel que :

declare -a APPS=('innoextract' 'fakeroot' 'iperf')

# Contrôle des dépendances
for dep in "${APPS[@]}"; do
   if [ -z "$(which "${dep}")" ]; then
      echo -e "${dep} est introuvable. \n Installez-le avant de lancer ce script. \n"
      exit 1
   fi
done

L’avantage du tuple, pour moi, est que c’est plus simple à gérer pour enlever/ajouter une commande, plutôt que dans la boucle ‘for’ …

PS : au fait, si je n’ai pas donné d’exemple à-propos du test, c’était surtout pour qu’il cherche par lui-même …
Maintenant, il a deux exemples, assez similaires qui lui montrent comment … et lui font comprendre aussi, qu’en dev, il y a souvent plusieurs façons de faire :wink:

Une méthode intéressante que ce “tuple”, qu’en bon autodidacte je ne connaissais pas. Merci pour la rapide explication, il ne se passera sûrement pas longtemps avant que je ne lui trouve un usage dans mes projets shell.

À moins que ce ne soit une fonction typique de bash incompatible avec le shell POSIX ?

RAhhh, crétin, je viens de remarquer un abus de language de ma part …
Le terme ‘tuple’ est emprunté au Python (tsss…), dans le cas de Bash, c’est un tableau :wink:

Après, je ne vois pas en quoi ce ne serait pas “Posix Compliance” …
Mais, sur cette question, je ne suis vraiment pas calé du tout !

[quote=“PengouinPdt”]Après, je ne vois pas en quoi ce ne serait pas “Posix Compliance” …
Mais, sur cette question, je ne suis vraiment pas calé du tout ![/quote]
Et bien le plus simple reste sûrement que j’essaye avant de revenir faire mon rapport.


[mono]Syntax error: “(” unexpected[/mono]

C’est bien un “bashisme”, dash n’est pas capable de l’interpréter sous cette forme.

Merci PengouinPdt, ne conaissant pas encore le bash j’ai fait au plus basique ! mais je vois tres bien tes amélioration ! on passe du basique à quelquechose de simple mais optimisé !

Ca fait quand méme du bien de coder de temps en temps :stuck_out_tongue:

ps: la prochaine fois je tacherais de faire mieux et de le poster correctement (en n’oubliant pas l’install par exemple !)

quote=“vv222”
[mono]Syntax error: “(” unexpected[/mono]

C’est bien un “bashisme”, dash n’est pas capable de l’interpréter sous cette forme.[/quote]

En effet, c’est un bashisme.

Tu peux donc l’écrire ainsi :

#!/bin/sh
set -- innoextract fakeroot iperf

# Contrôle des dépendances
for dep in "$@"; do
   if [ -z "$(which "${dep}")" ]; then
      printf "%s est introuvable. \n Installez-le avant de lancer ce script. \n" "${dep}"
      exit 1
   fi
done

Quel dommage que les variables de type tableau n’existent pas en POSIX … ou je n’ai vraiment pas trouvé comment faire !

[quote=“PengouinPdt”]Tu peux donc l’écrire ainsi :

[code]
#!/bin/sh
set – innoextract fakeroot iperf

Contrôle des dépendances

for dep in “$@”; do
(…)
[/code][/quote]
Sauf erreur de ma part, ça “écrase” les éventuels arguments donnés au script au moment de son lancement, non ?

Comme tu le remarques avec ce bout de code, c’est à toi de veiller à récupérer tes arguments avant d’initialiser les variables :wink:

#!/bin/sh
#set -x
arg1="$1"
printf "1: %s \n" "${arg1}"
set -- innoextract fakeroot iperf
printf "1: %s - ${arg1} \n" "$1"

Puisqu’en effet, set réinitialise les variables spéciales … donc avant d’initialiser, tu test le nombre d’arguments passés, et s’il y en a, tu les attribues à une variable … :smiley:

Je prends des notes, cette discussion est franchement enrichissante et devrait me permettre d’améliorer efficacement mes nombreux scripts shell.
Pour les curieux, un aperçu des scripts sur lesquels je travaille ces temps-ci peut se trouver par ici :
dotslashplay.it/scripts/fr/
(certificat auto-signé,
SHA1 : 08:7A:58:99:48:DF:C1:2D:F8:80:C3:3B:0F:B1:B9:76:F4:D6:89:E1
MD5 : 6F:72:65:0F:5E:B5:BC:84:6F:10:6B:26:BF:87:3B:8A)

Tiens pour toi:

nb_args="$#"
i=1

if [ -n "$nb_args" ]; then
    for arg in "$@"; do
        export arg$i="${arg}"
        i=$(($i+1))
    done
fi
unset i

printf "1: %s \n" "${arg1}"
set -- innoextract fakeroot iperf
printf "1: %s - ${arg1} \n" "$1"

Et, pour le fun, se rendre compte que c’est faisable avec la syntaxe HEREDOC, et une belle boucle while - “so, too much? it’s up to you!” :

deps="innoextract
fakeroot
iperf"

while read -r cmd; do
    printf "Checking $cmd ...\n"
    if ! command -v "$cmd"; then
        printf "Error: $cmd not found\n"
    else
        printf "Success: $cmd found\n"
    fi
    printf "\n"
done <<EOF
$deps
EOF

Cette dernière n’est pas de moi, je viens de la trouver ici (cf, en fin de page) !

Amuse-toi bien :smiley: :wink: