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 16/02/2010, à 16:07

beshop7895

[RESOLU] script bash éteindre automatique un PC (ubuntu server)

Bonjour

Je vous décris mon environnement et mon besoin.

environnement:
*routeur/modem adsl
    - freebox v5 et freexbox tvhd
    - adresse IP 192.168.1.254
   
*périphérique réseau
    - PC 1 : 192.168.1.1
    - PC 2 : 192.168.1.2
    - PC 3 : 192.168.1.4
    - serveur ubuntu server 9.10: 192.168.1.10 ; equipé de samba (partage de fichier pour windows)  et de fuppes pour la diffusion de videos vers la freebox tvHD.


besoin:
Comme indiqué dans l'objet, je souhaiterai faire un script en bash pour que mon serveur s'éteignent si tous les PCs sont éteints (réponse au ping négatif ou autre chose) et que le taux de transfert sur eth0 inférieur à 10ko/s.

petite précision: le test pour le debit sur la carte réseau me permet de laisser le serveur en fonction pendant le visionage d'une video sur la télé au travers de la freebox (upnp). J'ai pas envie d'avoir les pleurs de mes enfants dans les oreilles après l'extinction du serveur au mileu du visionage d'un dessin annimé... wink

ce script serait executer toutes les 5 ou 10 minutes.
d'avance merci.

PS: je suis un tout jeune novice, j'ai commencé a pratiquer le monde linux depuis 1 mois seulement.
Salutations

Dernière modification par beshop7895 (Le 22/03/2010, à 22:21)

Hors ligne

#2 Le 16/02/2010, à 17:12

geenux

Re : [RESOLU] script bash éteindre automatique un PC (ubuntu server)

Pour le ping, tu peux faire un truc du genre

ping -c 2 192.168.1.51
if [ $? == 1 ]; then
    echo "Connection ne fonctionne pas"
else
    echo "Connection fonctionne"
fi;

$? représente le code retour du programme précédemment lancé, ici ping. Code retour 0 si tout se passe bien, différent de zéro si il y a des erreurs.

Pour éteindre, tu as shutdown, ou poweroff sous Ubuntu. Shutdown est plus flexible.

Hors ligne

#3 Le 17/02/2010, à 15:36

beshop7895

Re : [RESOLU] script bash éteindre automatique un PC (ubuntu server)

merci pour la fonction ping:

dans un fichier adresse_ip.txt

192.168.1.1
192.168.1.2
192.168.1.4

donc mon script stopifnotuse.sh commencerai:

#!/bin/bash
# stopifnotuse

while read line
do ping -c 2 "$line\n"
if [ $? != 0 ]; then
    var stopPC=1 ##plus de PC sur le reseau
fi;
done < adresse_ip.txt

if [stopPC ==1]; then
sudo shutdown -h now
fi;

et maintenant il ne reste plus qu'à trouver comment mesurer le debit de la carte reseau et le comparer avec le debit maxi sous lequel le serveur doit s'éteindre.

Hors ligne

#4 Le 17/02/2010, à 15:47

geenux

Re : [RESOLU] script bash éteindre automatique un PC (ubuntu server)

Tu peux peut-être regarder du côté de vnstat.
Exemple :

vnstat -i wlan0 -tr
1199 packets sampled in 5 seconds    
Traffic average for wlan0

      rx           9.42 kB/s            100 packets/s
      tx          74.66 kB/s            139 packets/s

Hors ligne

#5 Le 18/02/2010, à 11:20

beshop7895

Re : [RESOLU] script bash éteindre automatique un PC (ubuntu server)

merci pour l'info, je vais appronfondir tout ça et je ne manquerez pas de vous transmettre le fruit de mon résultat.

Hors ligne

#6 Le 19/02/2010, à 00:09

beshop7895

Re : [RESOLU] script bash éteindre automatique un PC (ubuntu server)

Bonsoir
@geenux Sans vouloir etre desagréable, j'ai trouvé un bou de script qui est doit calculer le debit sur la carte reseau sur un intervale de 2 secondes:

le script créé et testé est:

#!/bin/bash
# Debit limite en dessous duquel le pc sera eteint, en ko/s
threshold_rate=10;

# Debit actuel sur eth
rate=$(/sbin/ifconfig eth | awk -F'[ :]' '/RX packets/ {print $13}' && sleep 2 && /sbin/ifconfig eth | awk -F'[ :]' '/RX packets/ {print $13}');
array = $rate ;
actual_diff_rate = array[1] - array[0] ;
actual_rate = actual_diff_rat2;
#Avant d'etindre le pc, on va verifier qu'il n'y a pas d'activite importante sur eth0
echo "    Det actuel sur eth: ${actual_rate}Ko/s";
if (( actual_rate <= threshold_rate )); then
echo "debit faible"
fi

mais ce dernier, a priori, ne fonctionne pas correctement. comme dirai une personne que je connais :"le problème en informatique se situe souvent entre la chaise et l'écran".
wink
voici les message qu'il me donne et que je necomprend pas.

/serveur_arret_test/testdebit.sh: 7: array: not found
/serveur_arret_test/testdebit.sh: 8: actual_diff_rate: not found
/serveur_arret_test/testdebit.sh: 9: actual_rate: not found
    Det actuel sur eth: Ko/s
/serveur_arret_test/testdebit.sh: 14: cannot open =: No such file
/serveur_arret_test/testdebit.sh: 14: actual_rate: not found

Que dois-je faire pour que ce dernier fonctionne?

d'avance merci et bonne nuit

Hors ligne

#7 Le 19/02/2010, à 13:16

geenux

Re : [RESOLU] script bash éteindre automatique un PC (ubuntu server)

Le script corrigé :

#!/bin/bash
# Debit limite en dessous duquel le pc sera eteint, en ko/s
threshold=10;

# Debit actuel sur eth
packets1=$(/sbin/ifconfig eth | awk -F'[ :]' '/Packets reçus/ {print $13}')
sleep 2
packets2=$(/sbin/ifconfig eth | awk -F'[ :]' '/Packets reçus/ {print $13}')
speed=$(( ($packets2-$packets1)/2 ))
##Avant d'etindre le pc, on va verifier qu'il n'y a pas d'activite importante sur eth0
echo "Det actuel sur eth: ${speed} Ko/s";
if [ $speed -le $threshold ] ; then
echo "debit faible"
fi

Le script que tu as posté était à peine une ébauche pleine d'erreurs de syntaxes (oublis de $ entre autres).

Nb : je l'ai aussi adapté de l'anglais au français, si ça ne fonctionne pas vérifie que la commande "ifconfig eth" nomme bien le nombre de paquets reçus "Packets reçus", et adapte si c'est autre chose.

Dernière modification par geenux (Le 19/02/2010, à 13:20)

Hors ligne

#8 Le 19/02/2010, à 23:05

beshop7895

Re : [RESOLU] script bash éteindre automatique un PC (ubuntu server)

Bonsoir à tous

après avoir rassemblé tous les morceaux, voici le code qui doit me permettre d'éteindre le serveur.

#!/bin/bash
# Debit limite en dessous duquel le pc sera eteint, en ko/s
threshold=10;
PCpresent=0;

while read line
do ping -c 2 "$line"
if [ $? -eq 0 ]; then
    PCpresent=1 ##plus de PC sur le reseau
fi;
done < adresse_ip.txt

if [ $PCpresent -eq 0 ]; then
echo "aucun pc connu sur le reseau"
# Debit actuel sur eth
packets1=$(/sbin/ifconfig eth | awk -F'[ :]' '/Octets transmis/ {print $18}')
sleep "2"
packets2=$(/sbin/ifconfig eth | awk -F'[ :]' '/Octets transmis/ {print $18}')
soustraction=$"packets2"-$"packets1"
if [ $"soustraction" -eq "0"]; 
then  sudo /sbin/shutdown -h now;
else speed=$(( $"soustraction"/2 ));
fi
##Avant d'etindre le pc, on va verifier qu'il n'y a pas d'activite importante sur eth0
echo "Det actuel sur eth: ${speed} Ko/s";
 if [ $speed -le $threshold ] ; then
 echo "debit faible et aucun PC sur le reseau donc extinction server";
 sudo /sbin/shutdown -h now;
 fi
else
echo "un ou plusieurs pc sont sur le reseau"
fi;

malgres tous mes efforts, je ne vois pas pourquoi ce script ne fonctionne pas.

Lorsque j'execute le script manuellement tout se passe bien, le ping fonctionne correctement et lorsque ce dernier s'execute automatiquement, ben la le serveur s'éteint malgres la présence d'autres PC sur le reseau...

je ne sais pas par ou chercher?
d'avance merci pour vos reponses futures et passées.

Dernière modification par beshop7895 (Le 27/02/2010, à 19:22)

Hors ligne

#9 Le 28/02/2010, à 15:01

beshop7895

Re : [RESOLU] script bash éteindre automatique un PC (ubuntu server)

Bonjour
Ayant quelques difficultées avec l'utilisation de la fonction Ping, surtout du à ma jeunesse dans l'ecriture de script en bash je pense;
Je me suis rabattu sur une fonction utilisé par un autre freenaute.
http://forum.ubuntu-fr.org/viewtopic.php?id=179375
qui se retrouvait dans une situation semblable à la mienne.

donc je vous livre le script tel que je l'utilise à l'heure actuelle:

#!/bin/bash

export LANG="fr_BE.UTF-8"

# Debit limite en dessous duquel le pc sera eteint, en ko/s
threshold="5" ;

nbclients=`netstat -lataupe |grep ESTABLISHED |grep -v localhost|grep -v 192.168.1.254|wc -l`
if [ "$nbclients" -eq "0" ] ;
then 
# plus de PC sur le reseau
# Debit actuel sur eth
packets1=$(/sbin/ifconfig eth | awk -F'[ :]' '/Octets transmis/ {print $18}') ;
sleep "2" ;
packets2=$(/sbin/ifconfig eth | awk -F'[ :]' '/Octets transmis/ {print $18}') ;
soustraction=$(( $packets2-$packets1 )) ;
if [ "$soustraction" -ne "0" ] ;
then speed=$(( $soustraction/2048 )) ;
# Avant d'eteindre le pc, on va verifier qu'il n'y a pas d'activite importante sur eth0
echo "Det actuel sur eth: ${speed} Ko/s" ;
if [ "$speed" -le "$threshold" ] ;
then echo "debit faible et aucun PC sur le reseau donc extinction server" ;
sudo /sbin/shutdown -h now ;
else echo "debit trop important pas d arret" ;
fi ;
fi ;
fi ;

Merci à tous pour votre aide
@ bientôt
B

Hors ligne

#10 Le 17/03/2010, à 23:59

beshop7895

Re : [RESOLU] script bash éteindre automatique un PC (ubuntu server)

Bonsoir

A l'heure actuelle ce dernier script ne me donne pas entière satisfaction. le serveur s'éteint si je n'ouvre pas, sur un des pc client, une fenêtre explorer pour visualiser le contenu d'un des répertoires partagés.

#!/bash/bash

# Debit limite en dessous duquel le pc sera eteint, en ko/s
# si (stopserveur == 0) alors serveur reste en fonction
# si (stopserveur == 1) alors serveur s eteint
debit='10' ;
stopserveur='1' ;

nbclients=`netstat -lataupe |grep ESTABLISHED |grep -v localhost|grep -v 192.168.1.254|wc -l`
echo "nombre de clients trouvés ${nbclients}"
if [ $nbclients -eq 0 ] ; then
while read line
do ping -c 3 "$line"
if [ $? -eq 0 ] ;
     then stopserveur='0';
    fi
done < adresse_ip.txt
else stopserveur='0';
fi

echo "la variable stopserveur ${stopserveur}"

if [ $stopserveur -eq 1 ] ;
then echo "aucun pc connu sur le reseau" ;
# Debit actuel sur eth
packets1=$(/sbin/ifconfig eth | awk -F'[ :]' '/Octets transmis/ {print $18}') ;
sleep "2" ;
packets2=$(/sbin/ifconfig eth | awk -F'[ :]' '/Octets transmis/ {print $18}') ;
soustraction=$(( $packets2-$packets1 )) ;
if [ $soustraction -ne 0 ] ;
then speed=$(( $soustraction/2048 )) ;
# Avant d'eteindre le pc, on va verifier qu'il n'y a pas d'activite importante sur eth0
echo "Det actuel sur eth: ${speed} Ko/s" ;
else speed="0";
fi

echo "$speed"
echo "$debit"

if [ $speed -le $debit ] ;
then echo "debit faible et aucun PC sur le reseau donc extinction server" ;
sudo /sbin/shutdown -h now ;
else echo "debit trop important le serveur reste en fonction" ;
fi
else echo "un ou plusieurs pc sont sur le reseau" ;
fi

lorsque que je suis identifié sur le serveur, fonctionnement de test, et que je teste mon script tout fonctionne bien

lorsque je ne suis pas identifié sur le serveur, fonctionnement normal, et que crontab utilise le script; le serveur s'éteint si la freebox HD est inactive et que un pc client est connecté au reseau local.

J'ai vu, au fur et à mesure de mes différentes recherches sur les forums, que  les variables d'environnements ne sont chargées que lorsque une prsonne se log sur le serveur;
d'ou ma question:
quelles sont les variables d'environnements nécessaire pour que le script fonctionne de façon identique en "periode de test" et en "periode normal"?

j'espère avoir été assez claire dans ma question, et j'espère que quelqu'un pourra me répondre.

@+ tard

Hors ligne

#11 Le 22/03/2010, à 22:20

beshop7895

Re : [RESOLU] script bash éteindre automatique un PC (ubuntu server)

Après quelques testes, je me suis aperçu que le ping n'était pas effectué. donc j'ai légèrement modifié mon script pour que ce dernier fonctionne et eviter la dépendance avec un autre fichier (le fichier adresse_ip.txt).

donc voici le code final et qui fonctionne parfaitement.
copier ce dernier dans un fichier qui se nommera stopifnotuse et qui sera enregistré sous /etc/cron.daily

#!/bin/bash

export LANG="fr_FR.UTF-8"
PATH=/usr/sbin:/usr/bin:/sbin:/bin

# /etc/cron.daily/stopifnotuse
# sudo chmod +x /etc/cron.daily/stopifnotuse
# sudo crontab -e

#SHELL=/bin/sh
#PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# * /10 * * * * /etc/cron.daily/stopifnotuse

# Debit limite en dessous duquel le pc sera eteint, en ko/s
# si (stopserveur == 0) alors serveur reste en fonction
# si (stopserveur == 1) alors serveur s eteint
# les adresses ip testees sont 192.168.1.1 192.168.1.2 192.168.1.4

debit='10' ;
stopserveur='1' ;

for i in 1 2 4
do
adresse="192.168.1.${i}"
ping -c 2 $adresse
if [ "$?" -eq 0 ] ;
    then stopserveur='0';
    fi
done

if [ "$stopserveur" -eq "1" ] ;
then echo "aucun pc connu sur le reseau" ;
# Debit actuel sur eth
packets1=$(/sbin/ifconfig eth | awk -F'[ :]' '/Octets transmis/ {print $18}') ;
sleep "2" ;
packets2=$(/sbin/ifconfig eth | awk -F'[ :]' '/Octets transmis/ {print $18}') ;
soustraction=$(( $packets2-$packets1 )) ;
if [ "$soustraction" -ne "0" ] ;
then speed=$(( $soustraction/2048 )) ;
# Avant d'eteindre le pc, on va verifier qu'il n'y a pas d'activite importante sur eth0
echo "Det actuel sur eth: ${speed} Ko/s" ;
else speed="0";
fi 

if [ "$speed" -le "$debit" ] ;
then echo "debit faible et aucun PC sur le reseau donc extinction server" ;
sudo /sbin/shutdown -h now ;
else echo "debit trop important le serveur reste en fonction" ;
fi
else echo "un ou plusieurs pc sont sur le reseau" ;
fi

une fois le script validé, il suffit de l'integrer à  cron pour automatiser son lancement avec
Code:

sudo crontab -e

en spécifiant le temps de surveillance du client connecté ou non (ici 10 min). ca donne (ligne dans crontab), penser à rajouter les deux lignes commençants par SHELL et PATH;
Code:

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
 * /10 * * * * /etc/cron.daily/stopifnotuse

voila j'ai enfin reussi à faire ce script et qu'il fonctionne parfaitement
-verification de la présence de PC sivant un test avec la fonction PING
-verification du débit de donnees sortantes du serveur (envoie de données vers la freebox HD)

@+ B

Hors ligne