Bonjour !
Je cherche à déterminer lequel des serveurs est le moins chargé pour un script de connexion automatique.
Pour cela, j'ai programmé la récupération de la liste depuis la page du site en php, puis coupé les éléments du fichier inutiles pour ne garder que l'essentiel
grep personnes /tmp/fip_occupation | cut -d '<' -f2 | cut -d '"' -f2
Le résultat :
338 personnes connectées à NL 278 personnes connectées à NL2 128 personnes connectées à NL3 133 personnes connectées à NL4 38 personnes connectées à IE 40 personnes connectées à IE2 10 personnes connectées à IE3 20 personnes connectées à IE4
Mais à partir de là, comment faire pour ne garder que le nom du serveur le moins chargé ?
Dans cet exemple j'aimerai simplement avoir comme retour "IE3" pour ensuite automatiser la connexion vers ce serveur.
Merci !
EDIT Voici un extrait un peu plus complet du script :
echo ----- OCCUPATION DES SERVEURS
echo
wget --no-check-certificate -O /tmp/fip_occupation https://freedom-ip.com/statistiques.php
SERV_LOAD=$(grep personnes /tmp/fip_occupation | cut -d '<' -f2 | cut -d '"' -f2)
echo
echo $SERV_LOAD
notify-send "Occupation des serveurs" "$SERV_LOAD"
# question
Posté par sputnick (site web personnel, Mastodon) . Évalué à 0.
Peux tu avoir ce fichier avec des retours à la lignes plutôt que tout sur la même ligne ? Ca va simplifier…
On ne peut pas mettre d'array dans le string...
[^] # Re: question
Posté par DooM . Évalué à 0.
Bonjour !
Je ne comprends pas pourquoi, je lance ma commande seule dans un terminal le résultat est affiché avec des retours de ligne (1 serveur par ligne) mais ce n'est pas le cas en exécutant le script
# une solution Perlesque
Posté par sputnick (site web personnel, Mastodon) . Évalué à 1.
Voici comment faire avec un algo simple en Perl (on boucle de 5 en 5, on récupère le nombre de connectés, si il est inférieur au précédent on récupère le nom du serveur) :
Usage :
On ne peut pas mettre d'array dans le string...
# Solution quick & dirty Bash
Posté par sputnick (site web personnel, Mastodon) . Évalué à 0.
Sinon en bash quick & dirty :
remplir le fichier /tmp/FICHIER puis
On ne peut pas mettre d'array dans le string...
[^] # Re: Solution quick & dirty Bash
Posté par M.Poil (site web personnel) . Évalué à 0. Dernière modification le 24 août 2012 à 08:26.
ou encore
Ce qui donnerai
Is it a Bird? Is it a Plane?? No, it's Super Poil !!!
[^] # Re: Solution quick & dirty Bash
Posté par M.Poil (site web personnel) . Évalué à 0. Dernière modification le 24 août 2012 à 08:37.
nota tu peux faire exactement la même chose sans utiliser awk
Is it a Bird? Is it a Plane?? No, it's Super Poil !!!
[^] # Re: Solution quick & dirty Bash
Posté par DooM . Évalué à 0.
Me donne le même résultat mais efface "personnes connectées à"
[^] # Re: Solution quick & dirty Bash
Posté par DooM . Évalué à 0. Dernière modification le 24 août 2012 à 12:07.
avec
j'ai les résultats dans l'ordre ! :)
# en shell
Posté par NeoX . Évalué à 4. Dernière modification le 23 août 2012 à 20:14.
1°) ajoute des retours à la ligne entre chaque serveur (dans le script fip_occupation)
2°) puis ajoute à ta ligne
pour ne recuperer que le dernier de la liste classé par ordre decroissant.
il ne te reste plus qu'à refaire des cut/awk pour ne prendre que la 5e colonne
[^] # Re: en shell
Posté par DooM . Évalué à 1. Dernière modification le 24 août 2012 à 11:56.
Bonjour !
En effet, quand je lance la commande seule dans un terminal les résultats sont bien affichés avec des retours de ligne.
Par contre dans le script tout s'affiche à la suite… :(
PS: fip_occupation n'est pas un script mais la page .php qui affiche l'occupation des serveurs et que je récupère directement avec wget.
J'ai édité le post original pour l'exemple :)
[^] # Re: en shell
Posté par NeoX . Évalué à 2. Dernière modification le 24 août 2012 à 13:33.
chez moi ca marche avec l'option rn à sort (classement numerique : n, et decroissant r)
puis la meme en ajoutant le tail -n1 pour prendre la derniere ligne
[^] # Re: en shell
Posté par DooM . Évalué à 0. Dernière modification le 24 août 2012 à 14:35.
Oui c'est curieux, je pense que ça doit venir du fait que j'intègre la commande dans la variable SERV_MIN_LOAD=$( )
Mais grâce à vous tous, le script fonctionne enfin !! Merci !! Voir dernier commentaire :)
# Parfait !
Posté par DooM . Évalué à 1. Dernière modification le 24 août 2012 à 13:31.
Parfait !!!
Voici la ligne de script :
qui me retourne :
De fait, le serveur le moins occupé est définit dans $SERV_MIN_LOAD , ce qui me permet de la réutiliser pour la connexion :D
Un grand merci à tous !!!
[^] # Re: Parfait !
Posté par M.Poil (site web personnel) . Évalué à 1.
Tu aurais également pu faire (juste pour te montrer qu'il y a plein de solution à un problème)
ou
ou
…
Is it a Bird? Is it a Plane?? No, it's Super Poil !!!
[^] # Re: Parfait !
Posté par DooM . Évalué à 0.
wow !
Cela me dépasse complètement !!!
Mais qui sait, vu que je le retrouve de plus en plus souvent confronté à la nécessité du bash script, ça pourrait bien m'être utile un jour :))
Merci :))
# SCRIPT COMPLET
Posté par DooM . Évalué à 1.
Pour ceux que ça intéresserait, voici le script complet.
Je sais qu'il pourrait être nettoyé, optimisé et qu'on pourrait même y ajouter certaines fonctions. Mais pour l'instant c'est le mieux que je puisse faire !
Le script à pour but de connecter automatiquement un serveur OpenVPN au démarrage d'une session Linux à condition de de l'avoir ajouté à gnome-session-properties, ou d'avoir créé un lanceur .desktop dans /etc/xdg/autostart/, ou encore de l'avoir placé dans /etc/NetworkManager/Dispatcher.d/ (dans ce dernier cas aucune déconnexion sera possible, et les notifications ne s'afficheront pas).
Voici le code, originalement créé pour la communauté Freedom-Ip qui offre un service OpenVPN gratuit.
Mais attention ! Ce script cherche les valeurs freedomip retournées par le NerworkManager d'Ubuntu, pensez à le modifier en conséquence ;)
Fonctions du script:
Script:
Encore un grand merci à vous tous pour votre aide précieuse ;)
[^] # Re: SCRIPT COMPLET
Posté par NeoX . Évalué à 2. Dernière modification le 25 août 2012 à 09:49.
y a quelques ameliorations possibles
ex : tester si y a du reseau, de l'internet et si le VPN est ouvert.
s'il est deja ouvert, ne pas besoin de calculer l'occupation des serveurs
mais je viens de lire ton script en entier, et si le vpn est deja ouvert, tu le fermes pour en ouvrir un sur le serveur le moins chargé.
c'est intelligent.
[^] # Re: SCRIPT COMPLET
Posté par M.Poil (site web personnel) . Évalué à 1.
Généralement je teste les codes retours plutôt que ce qui est affiché (qui peut changer en fonction de l'environnement LANG utilisé)
exemple : a la place de
j'aurai plus tendance à faire
Is it a Bird? Is it a Plane?? No, it's Super Poil !!!
[^] # Re: SCRIPT COMPLET
Posté par DooM . Évalué à 1.
Ok je comprends :)
Du coup j'ai modifié comme ceci pour conserver un retour terminal "propre" :
[^] # Re: SCRIPT COMPLET
Posté par pier (site web personnel) . Évalué à 1. Dernière modification le 26 août 2012 à 10:50.
Attention commentaire extrémiste :
Puisque vous parlez d optimisation je rajoute mon grain de sel de "Bonnes pratiques".
PING() { If { ping -c 3 vpn2.freedom-ip.com | grep % | cut -d ' ' -f4 ; } ; then return 0 else return 1 fi }
À la place de :PING=$(ping -c 3 vpn2.freedom-ip.com | grep % | cut -d ' ' -f4)
C est plus long mais plus robuste selon moi, et plus facilement reutilisable à priori.
Dans la série 'c'est mieux comme ça' :
Il est conseille d'utiliser des doubles crochets plutôt que les simples, ils sont plus robuste et souples.
Voilà c'est pas forcément très utile mais tant qu'à coder du bash autant faire avec les standard, non ?
Ah oui : pardon pour les tags du code mais 'lapin compris' comment ca fonctionne !
[^] # Re: SCRIPT COMPLET
Posté par DooM . Évalué à 0.
LoL oui je suis aussi toujours à la recherche de la "perfection".
Mais je commence seulement à tâter du bash script, et là ça me rajoute des lignes. Alors que je cherche au contraire à y voir plus clair en en mettant le moins possible.
Mais merci quand même, ça peut toujours servir !
[^] # Re: SCRIPT COMPLET
Posté par NeoX . Évalué à 3.
c'est en prenant tres tot les bonnes habitudes qu'on acquiert les bonnes pratiques.
et un code sur une ligne n'est pas forcement plus clair ou plus efficace qu'un code sur plusieurs lignes.
# MAJ SCRIPT
Posté par DooM . Évalué à 0.
Bonsoir !
Mise à jour du script !!!!
MAJ 28 AOÛT :
Encore merci pour votre aide !!! :D
[^] # Re: MAJ SCRIPT
Posté par Michaël (site web personnel) . Évalué à 2. Dernière modification le 28 août 2012 à 21:15.
Ta deuxième version de ton script est absolument gorissime. J'ai donc pris mon stylo pour t'écrire le canvas suivant:
(Il faut remplacer les
[@
par un[[
mais dacode croit qu'il s'agit de liens wikipedia, d'où le subtil déguisement.)Ce n'est pas interdit de définir des fonctions au lieu de copier et coller à tort et à travers!
Ton bloc d'extraction des données de la page est visiblement un bon candidat pour faire une fonction. Au lieu d'enchaîner les
cut
on peut faire le travail proprement avec sed. C'est ma fonctionsdata_extract
qui mange ton fichier HTML et écrit un beau tableau bien propre avec toutes les statistiques. C'est l'étape N°1 de tout programme shell qui travaille sur des données: extraire les données dans un format propre. Après c'est un jeu d'enfant de les maniper avec sort, awk, etc.Ensuite ton gros bloc de if imbiqués est classiquement représenté par une boucle, ce que fait le
while
, et c'est toujours achement plus facile de caler la boucle while dans une fonction dédiée (plus facile pour les pipes).Ensuite, quelques conseils en vrac, que tu peux utiliser même si tu débutes en shell:
si tes diagnostics sont internationalisés il faut les piper à travers iconv avant de les afficher. Par exemple
printf 'Pouët\n' | iconv -f utf-8
si ton script est en utf-8, éventuellement rédiriger vers stderr.
Les trentes lignes de echo avec des lignes vides, des 'début de script' etc. ne servent à rien et créent une sortie inutilement difficile à analyser avec un programme: vire les.
Continue de poser tes questions ici, et si tu n'as pas lu ce journal vas-y!
[^] # Re: MAJ SCRIPT
Posté par claudex . Évalué à 4.
Voilà l'entrée dans le suivi : http://linuxfr.org/suivi/insertion-de-liens-wikipedia-dans-les-balises-de-code
« Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche
[^] # Re: MAJ SCRIPT
Posté par Michaël (site web personnel) . Évalué à 2.
Merci, la soirée était bien avancée hier et j'ai eu la flemme d'ouvrir une entrée dans le suivi!
[^] # Re: MAJ SCRIPT
Posté par DooM . Évalué à 1.
wow !
C'est sûr que le script est beaucoup plus organisé et compact comme ça :)
Maintenant il ne me reste plus qu'à le comprendre !!! Mais merci je vais plancher là-dessus ;)
[^] # Re: MAJ SCRIPT
Posté par Michaël (site web personnel) . Évalué à 2.
Si tout à la fin tu enlèves l'appel à la fonction principale, tu peux jouer avec les diverses fonctions pour voir ce qu'elles font.
C'est très important d'expérimenter pour se sentir à l'aise!
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.