Accueil > Linux & Logiciels Libres > Script bash Linux de surveillance de copie/téléchargement avec arrêt (...)
411 visites

Script bash Linux de surveillance de copie/téléchargement avec arrêt système

vendredi 1er mai 2015

Version imprimable de cet article Version imprimable

Il existe pour Firefox le plugin Auto Shutdown NG, à combiner avec DownThemAll, qui permet d’éteindre l’ordinateur après la fin de tous les téléchargements, mais ce système est limité aux téléchargements "classiques" par Firefox.
Les téléchargements de média (musique/vidéo) capturés depuis un Flash Player avec un plugin comme Flashgot ne sont pas pris en compte par DownThemAll et Auto Shutdown, d’où la création de ce petit script.

Ce script bash Linux, par ailleurs très simple, surveille le téléchargement ou la copie d’un fichier, et arrête le système lorsque le téléchargement/copie est terminé ou planté.

Cela permettre de suivre un téléchargement par Firefox, par FTP (Filezilla...) ou même une copie de fichier.

La progression ou l’échec sont déterminés par l’évolution ou la non évolution de la taille du fichier.

Il serait possible de traiter un dossier au lieu d’un fichier, en remplaçant la commande ls -l par une commande du -s.

Le lancement du script se fait en root, ou en passant par une délégation sudo (avec option NOPASSWD) afin d’avoir le droit d’éteindre l’ordinateur par la commande Shutdown, ce qui est la méthode la plus simple.
il serait possible de changer la commande d’extinction pour pouvoir lancer le script avec un utilisateur normal sans se soucier des restrictions système.
Il serait également possible de traiter non pas un fichier en mettant sa taille dans une variable, mais un liste de fichiers avec leurs tailles dans un tableau.

On appelle ce script avec le nom et chemin (de préférence) absolu du fichier, en entourant la chaîne de guillemets pour protéger les espaces et caractères spéciaux.
Les messages d’information et d’erreur sont affichés à l’écran en plus d’être écris dans un fichier journal (ici script.log)

L’algorithme est assez simple :

#!/bin/bash
taille=1;
oldtaille=0;
fichier=$1;
echo "Surveillance du téléchargement de ${fichier}"
if [ -e "$fichier" -a -f "$fichier" ]
then
       echo "le fichier existe et est bien de type fichier, on continue" | tee -a script.log;

  • On commence par vérifier que le fichier existe, et si oui on entre dans la boucle
  • et tant que la taille de fichier que l’on vient de lister diffère de celle enregistrée précédemment,
           while [ $oldtaille != $taille ]
           do

  • Alors si le fichier existe encore, le téléchargement/copie n’a pas planté
    • on lit la taille du fichier et on attend 30 minutes avant de recommencer

               if [ -e "$fichier" -a -f "$fichier" ]
               then
                       oldtaille=$taille;
                       taille=$(ls "$fichier" -l | awk '{ print $5 }' | awk -FM '{ print $1 }');
                       echo "Le $(date), avant : $oldtaille, maintenant : $taille" | tee -a script.log;
                       if [ $oldtaille != $taille ]
                       then
                               sleep 30m;
                       fi
               else

  • le temps d’attente de 30 minutes est conditionné à la différence de taille actuelle/précédente du fichier afin de ne pas attendre pour le dernier cycle, pour lequel la condition d’entrée de la boucle while sera fausse, ce qui permettra de terminer le programme.
    • on pourrait ajouter une condition else qui éteindrai alors directement le système à l’intérieur de la boucle while.
  • sinon le fichier n’est plus là, le téléchargement/copie à planté, et on arrête le système

                       echo "Le fichier n'existe plus, le téléchargement a planté" | tee -a script.log;
                       taille=0;
                       oldtaille=0;
               fi
       done

A la fin de la boucle

  • dans laquelle on est entré si le fichier existait
  • et dont on sort si la taille actuelle est différente, 30 minutes plus tard, de la taille précédente

on éteint le système.

       echo "fin du script le $(date), taille = $taille, avant = $oldtaille" | tee -a script.log
       shutdown -hP now
else
       echo "fichier non trouvé.";
fi

Répondre à cet article

Total 114732 visites depuis 2023 jours | Site réalisé par Vader[FR] | SPIP | | Plan du site | Suivre la vie du site RSS 2.0 | contact mail